C # - DLLImport и значения функций по умолчанию - PullRequest
3 голосов
/ 20 июля 2010

Я взаимодействую с собственной сторонней C ++ DLL через C #, и предоставленный уровень взаимодействия выглядит следующим образом:

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);

Обратите внимание, что в определении Ctern есть только два параметра, поскольку функция C ++ предоставляет значение по умолчанию для третьего параметра.Это правильно?Я получал некоторые недетерминированные результаты при использовании предоставленного определения, но когда я добавил третий параметр, как показано ниже, он, кажется, работает правильно каждый раз, а не спорадически.

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

Есть идеи?Будет ли добавление 3-го параметра действительно решить эту проблему?

1 Ответ

6 голосов
/ 20 июля 2010

Необязательный параметр в C ++ разрешается во время компиляции.Когда вы вызываете это через P / Invoke, вам нужно всегда указывать все три параметра.

Если вы хотите иметь необязательный параметр, вам нужно создать обертку C # для этого метода с перегрузкой, котораяобеспечивает дополнительную поддержку (или необязательный параметр C # 4).Однако фактический вызов в библиотеку C ++ должен всегда указывать все три аргумента.

...