代码之家  ›  专栏  ›  技术社区  ›  Taylor Leese

C#-DLLImport和函数默认值

  •  3
  • Taylor Leese  · 技术社区  · 14 年前

    我通过C语言与本地第三方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语言外部定义中只有两个参数,因为C++函数为第三个参数提供默认值。是这样吗?在使用提供的定义时,我收到了一些不确定的结果,但是当我添加下面这样的第三个参数时,它似乎每次都正常工作,而不是零星地工作。

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

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

    1 回复  |  直到 14 年前
        1
  •  6
  •   Reed Copsey    14 年前

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

    如果希望有一个可选参数,则需要在该方法周围创建一个C#包装器,其中包含一个提供可选支持的重载(或一个C#4可选参数)。然而,C++库中的实际调用应该总是指定所有三个参数。