我调用的是delphi写的函数,在delphi里函数输入参数用的是pchar,输出widestring,返回值integer,我在c#中调用的时候把输入换成stringbuilder,输出参数类型替换成string,可以成功得到integer的返回值,但是输出的temptest总是空的,dll是外单位提供的产品,应该不会有错,退出时报题目的两个错,部分代码如下:
[DllImport("abc.DLL",CharSet=CharSet.Ansi)]
public static extern int GETDATE(StringBuilder USERID,string test);
private void button1_Click(object sender, System.EventArgs e)
{
string temptest="";
StringBuilder a=new StringBuilder("1");
textBox1.Text=Convert.ToString(GETDATE(a,temptest));
MessageBox.Show(temptest);
}
[DllImport("abc.DLL",CharSet=CharSet.Ansi)]
public static extern int GETDATE(StringBuilder USERID,string test);
private void button1_Click(object sender, System.EventArgs e)
{
string temptest="";
StringBuilder a=new StringBuilder("1");
textBox1.Text=Convert.ToString(GETDATE(a,temptest));
MessageBox.Show(temptest);
}
[DllImport("YourDllFileNameHere",
EntryPoint="CalledFuntionName",
SetLastError=true,
CharSet=CharSet.Ansi, ExactSpelling=true,
CallingConvention=CallingConvention.StdCall)
]
[return:MarshalAs(UnmanagedType.U8)]//这个根据返回的实际类型设定
public static extern int GETDATE(StringBuilder USERID,string test);这个问题应该是类型的大小不兼容导致的,从根本上说是由于你的函数返回地址错位了。
函数在调用的时候会根据函数的签名还保护现场,然后去执行函数体中的内容,通过签名中的各个类型大小,此时(执行函数体之前)函数的返回地址已经确定,但是由于你给的参数的长度和那个函数实际处理的大小不一致导致函数返回地址错误,所以就会出现你说的错误!