C# - DLLImport 和函数默认值
Posted
技术标签:
【中文标题】C# - DLLImport 和函数默认值【英文标题】:C# - DLLImport and function default values 【发布时间】:2010-07-20 17:48:42 【问题描述】:我正在通过 C# 与本机 3rd 方 C++ DLL 交互,提供的互操作层如下所示:
C#:
[DllImport("csvcomm.dll")]
public static extern int CSVC_ValidateCertificate(byte[] certDER, int length);
C++:
CSVC_Status_t CSVCOMM_API CSVC_ValidateCertificate(BYTE* certDER, DWORD length,
DWORD context = CONTEXT_DEFAULT);
注意,C# extern 定义中只有两个参数,因为 C++ 函数为第三个参数提供了默认值。它是否正确?使用提供的定义时,我收到了一些不确定的结果,但是当我添加如下第三个参数时,它似乎每次都能正常工作,而不是偶尔工作。
[DllImport("csvcomm.dll")]
public static extern int CSVC_ValidateCertificate(byte[] certDER, int length,
int context);
有什么想法吗?添加第三个参数真的可以解决这个问题吗?
【问题讨论】:
【参考方案1】:C++ 中的可选参数在编译时解析。当您通过 P/Invoke 调用它时,您需要始终指定所有三个参数。
如果您想要一个可选参数,您需要围绕此方法创建一个 C# 包装器,并使用提供可选支持的重载(或 C# 4 可选参数)。但是,对 C++ 库的实际调用应始终指定所有三个参数。
【讨论】:
好的,我想这就是我添加第三个参数的原因。对我来说仍然很奇怪,这个电话似乎仍然有一半的时间在没有它的情况下工作。 @Taylor:您的 C++ 函数可能正在读取第二个参数之外的内存,并为第三个参数获取垃圾数据(因为它希望它在那里)。这有时可能会起作用,但由于它只是在喂垃圾,所以它并不可靠(或正确)。以上是关于C# - DLLImport 和函数默认值的主要内容,如果未能解决你的问题,请参考以下文章
dllimport如何在非托管dll中获取哪个应用程序调用了函数