【发布时间】:2011-10-06 05:27:04
【问题描述】:
我正在尝试与实现多个函数的 Dll 进行交互,其中一个函数接受一个以空字符结尾的字符串和一个 int,并返回一个以空字符结尾的字符串。我试图与这样的方法进行交互:
[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 接口的文档。