3

我编写了一个 C dll,其中包含一个接受 4 个参数并返回一个数字的函数。然后我创建了一个 C# 应用程序并使用 PInvoke 调用了 dll 函数。一切正常。然后我将 dll 函数中的参数从 4 更改为 3。但是我没有更改 C# 中的方法签名(DllImport 方法签名)。令我惊讶的是,调用仍然从 C# 成功,但我从 dll 函数返回了一些意外的值。

我期待一个例外,但电话通过了。使用 P/Invoke 进行函数调用时,有什么方法可以严格执行参数计数?

4

1 回答 1

4

没有办法强制参数计数匹配。你只需要把它做对。调用约定、参数类型等也是如此。

与托管代码不同,本机 DLL 没有描述必须如何调用它们的元数据。

如果您启用 p/invoke 堆栈不平衡 MDA,那么您至少能够检测到您在运行时犯的错误。

于 2013-04-04T00:19:20.127 回答