Выделение двойных параметров с помощью P / Invoke - PullRequest
0 голосов
/ 01 декабря 2010

У меня проблема с вызовом P / Invoke, который я пытаюсь сделать. Я должен вызвать класс C ++ из программы на C #. У меня есть источник этого класса, поэтому я поместил его в проект DLL и создал функции экспорта для доступа к его основному методу. Этого должно быть достаточно, чтобы делать то, что мне нужно, и все упростить.

Мой метод экспорта выглядит так:

extern "C" _declspec(dllexport) void Inference(double *c1, double *c2, double *c3, double *result)
{
    /* somecode */
}

Это компилируется, и я могу видеть экспорт в dumpbin выводе.

Теперь проблема в том, что я не могу вызвать этот метод из своего кода C #, потому что я всегда получаю исключение PInvokeStackInbalance, сообщающее мне, что

Это скорее всего потому, что управляемый PInvoke подпись не соответствует неуправляемая целевая подпись.

Я попытался вызвать метод следующим образом:

[DllImport("InferenceEngine.dll")]
extern static unsafe void Inference(double *c1, double *c2, double *c3, double *result);

Я тоже пробовал это:

[DllImport("InferenceEngine.dll")]
extern static void Inference(ref double c1, ref double c2, ref double c3, ref double result);

... оба эти способа были задокументированы в MSDN, но безуспешно. Кто-нибудь знает, в чем проблема?

Спасибо!

1 Ответ

3 голосов
/ 01 декабря 2010

Вы должны объявить вашу функцию C ++ как __stdcall, которая является значением по умолчанию для P / Invoke:

extern "C" _declspec(dllexport) void __stdcall Inference(double *c1, double *c2, double *c3, double *result);

Также можно оставить прототип C ++ в покое и изменить объявление P / Invoke:

[DllImport("InferenceEngine.dll", CallingConvention=CallingConvention.Cdecl)]

cdecl не часто используется с P / Invoke, возможно, потому что Windows API является stdcall.

...