我想与一个Dll实现几个函数接口,其中一个接受一个空终止的字符串和一个int,并返回一个空终止的字符串。我试图用这样的方法接口:DllImport返回null终止字符串AccessViolationException
[DllImport(dll_loc)]
[return : MarshalAs(UnmanagedType.LPStr)]
public static extern StringBuilder GetErrorMessage([MarshalAs(UnmanagedType.LPStr)]
StringBuilder message,
int error_code);
我再尝试调用这样的方法:
StringBuilder message = new StringBuilder(1000);
StringBuilder out2 = new StringBuilder(1000);
out2 = GetErrorMessage(message, res0);
然而,当我尝试这一点,AccessViolationException
抛出告诉我,我是试图访问受保护的内存。
我是成功的在声明不同的方法,如:
[DllImport(dll_loc)]
public static extern int GetVersion([MarshalAs(UnmanagedType.LPStr)]
StringBuilder version);
,把它以同样的方式,但这种方法不适用于当前函数调用运行。
我也试过返回一个IntPtr,因为文档技术上说该方法返回一个指向字符串缓冲区的第一个字符的指针,但无济于事。
有没有人对这里可能出现的问题有所了解?这两种方法可能会导致dll尝试访问它不应该访问的内存。或者,你会如何建议去调试这个问题?
在禁止某些Windows DLL时遇到类似问题。我发现参数中的一些小调整导致了巨大的改进。即使是一些错误的编组/数据类型/等等。造成巨大的分歧。你必须仔细看看你的非托管DLL接口的文档。 –