C# - DLLImport和函数默认值

Tay*_*ese 3 .net c# c++ pinvoke dllimport

我通过C#与本地第三方C++ DLL连接,提供的互操作层如下所示:

C#:

[DllImport("csvcomm.dll")]
public static extern int CSVC_ValidateCertificate(byte[] certDER, int length);
Run Code Online (Sandbox Code Playgroud)

C++:

CSVC_Status_t CSVCOMM_API CSVC_ValidateCertificate(BYTE* certDER, DWORD length, 
    DWORD context = CONTEXT_DEFAULT);
Run Code Online (Sandbox Code Playgroud)

注意,C#extern定义中只有两个参数,因为C++函数为第三个参数提供了一个默认值.它是否正确?在使用提供的定义时,我收到了一些不确定的结果,但是当我添加第三个参数时,它似乎每次都正常工作而不是零星.

[DllImport("csvcomm.dll")]
public static extern int CSVC_ValidateCertificate(byte[] certDER, int length, 
    int context);
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?添加第3个参数真的可以解决这个问题吗?

Ree*_*sey 6

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

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

  • @Taylor:你的C++函数可能是读取超出第二个参数的内存,并获取第三个参数的垃圾数据(因为它希望它在那里).这可能有时会起作用,但由于它只是喂垃圾,它不可靠(或正确). (3认同)