C# - DLLImport 和函数默认值

标签 c# .net c++ pinvoke dllimport

我正在通过 C# 与 native 第 3 方 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);

有什么想法吗?添加第三个参数真的能解决这个问题吗?

最佳答案

C++ 中的可选参数是在编译时解析的。当您通过 P/Invoke 调用它时,您需要始终指定所有三个参数。

如果您想要一个可选参数,则需要使用提供可选支持(或 C# 4 可选参数)的重载围绕此方法创建一个 C# 包装器。然而,对 C++ 库的实际调用应始终指定所有三个参数。

关于C# - DLLImport 和函数默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3292811/

相关文章:

c# - EF 核心中的 NOT LIKE(表达式树)

c# - 如何在与文本框控件无关的情况下将 ENTER 链接/设置为 winforms 中的函数?

c# - .Net 最大并发计时器线程数

c# - .net 4.0 中的 MemoryCache 与 ObjectCache 有什么区别?

c++ - 强制 VS C++ 编译器以 RELEASE 模式运行代码

c++ - 虚拟析构函数有什么用?

c# - 代码仅将最后一个工作表转换为 csv

c# - System.InvalidCastException double 字符串

c# - 当窗体具有许多下拉列表控件时,C#.net 窗体调整大小缓慢

c++ - 使用 C++ STL 库查找变量模式