调用C DLL fom C时出现问题#
C函数是(我没有一个C头或者一个很好的规范:()
int knr12_read ( char *kn12, char *ik9, char *wok, char *wlc,
char *plz, char *ort, char *woz );
kn12是ref参数
这就是我在C语言里试过的#
[return: MarshalAs(UnmanagedType.U4)]
[DllImport("Knr12.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "knr12_read", CharSet = CharSet.Ansi)]
unsafe public static extern int knr12_read(out IntPtr buffer, string ik9, string wok, string wlc, string plz, string ort, string woz);
int knr = knr12_read(out pBuffer, knrTemp, "11111", "", "98529", "Suhl", "1");
string data = Marshal.PtrToStringAnsi(pBuffer);
返回的int总是正确的,应该是怎样的,但是ref参数pBuffer有问题。。。
其他变量的sting类型也在工作。。。
当我使用
ref
时,我总是得到一个AccessViolation error
。请引导。
最佳答案
StringBuilder
在P/调用带有字符串返回参数的函数时通常是一种很好的类型:
static extern int knr12_read(StringBuilder kn12, ...)
在调用函数之前,需要初始化字符串生成器,例如:
StringBuilder outString = new StringBuilder(100);
您不应该需要“不安全”代码,除非“C”代码在指针上保留的时间超过调用的持续时间,否则您不应该担心固定-框架正在为您这样做。
这里有一个应该有用的问题:Marshal "char *" in C#
关于c# - C#AccessViolation/编码(marshal)中的 native C-DLL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12974875/