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 和函数默认值的主要内容,如果未能解决你的问题,请参考以下文章

获取cpu和内存使用情况

C# 中用于从 DllImport 函数中检索引用的指针

c#使用DllImport调用c++dll的函数

dllimport如何在非托管dll中获取哪个应用程序调用了函数

调用从 c# 返回 char* 的 c++ dll 函数。无法使用 DllImport()

C#:一个属性用于多个声明 (DLLImport)