我正在尝试从 C# 调用非托管 DLL。我对非托管代码和 P\Invoke 的经验很少,所以我希望多一双眼睛。
除了函数之外,我没有太多关于 DLL 的信息:
int Initialize(char *FileName, int Driver, int(*InfoLine)(char*), char *Message);
信息行可以为空。
所以这就是我在 C# 中所做的。
导入调用:
[DllImport(@"c:\Core\initialization.dll", EntryPoint="Initialize", CharSet = CharSet.Auto)]
private static extern int Initialize([MarshalAs(UnmanagedType.LPStr)] string FileName, int Driver, System.IntPtr InfoLine, [MarshalAs(UnmanagedType.LPStr)] string Message);
方法调用是:
IntPtr infoLine = IntPtr.Zero;
string message = "";
int success = Initialize(@"c:\config.dat", -1, infoLine, message);
Visual Studio 在调试模式下返回给我的错误消息是:
调用 PInvoke 函数“初始化”使堆栈失衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。
我错误地传递了哪个参数?
我相当肯定对 DLL 的调用是正确的,因为有另一个函数没有传递参数并且类似的导入和方法代码有效。
谢谢您的帮助。