我试图与实现几个函数的Dll接口,其中一个函数接受一个空终止的字符串和一个int,并返回一个以null结尾的字符串.我试图与这样的方法接口:
[DllImport(dll_loc)]
[return : MarshalAs(UnmanagedType.LPStr)]
public static extern StringBuilder GetErrorMessage([MarshalAs(UnmanagedType.LPStr)]
StringBuilder message,
int error_code);
Run Code Online (Sandbox Code Playgroud)
然后我尝试调用这样的方法:
StringBuilder message = new StringBuilder(1000);
StringBuilder out2 = new StringBuilder(1000);
out2 = GetErrorMessage(message, res0);
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试这个时,AccessViolationException会抛出一个告诉我我正在尝试访问受保护的内存.
我成功地声明了一个不同的方法:
[DllImport(dll_loc)]
public static extern int GetVersion([MarshalAs(UnmanagedType.LPStr)]
StringBuilder version);
Run Code Online (Sandbox Code Playgroud)
并以相同的方式调用它,但此方法不适用于当前函数调用.
我也尝试返回一个IntPtr,因为文档在技术上说该方法返回一个指向字符串缓冲区的第一个字符的指针,但无济于事.
有没有人对这里可能出现的问题有任何见解?导致dll尝试访问内存的这两种方法之间可能有什么不同呢.或者,您如何建议调试此问题?