调用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/

10-12 12:35