Как передать двойное значение параметра C ++ с помощью DLLImport? - PullRequest
1 голос
/ 06 апреля 2011

У меня есть метод C ++, и он принимает параметр типа double, например

extern "C" {
    __declspec(dllexport) void __cdecl GetResult (double resultLine);
}

На стороне C # я могу вызвать метод, но он всегда преобразует значение resultLine в 0. Я вызываю метод C ++ DLL с помощью внешней функции DLLImport:

internal static class UnsafeNativeMethods
{
const string _dllLocation = "CoreDLL.dll";
[DllImport(_dllLocation)]
public static extern void GetResult(double resultLine);
}

Я могу вызвать другие методы, которые принимают строковое значение, и все работает, но по какой-то причине оно не работает, когда я передаю двойное значение.

Это правильный способ передачи двойного значения? или мне нужно использовать ref / out и т. д.

Ответы [ 2 ]

3 голосов
/ 06 апреля 2011

Я не уверен на 100%, что это связано, но фундаментальная ошибка, которую я вижу здесь, состоит в том, что вы неправильно поняли соглашение о вызовах. Если вы ничего не указали, атрибут DllImport будет использовать Winapi соглашение о вызовах, которое на самом деле __stdcall, а вам нужно __cdecl.

Чтобы устранить эту проблему, установите для поля CallingConvention значение CallingConvention.Cdecl:

internal static class UnsafeNativeMethods
{
const string _dllLocation = "CoreDLL.dll";
[DllImport(_dllLocation), CallingConvention=CallingConvention.Cdecl]
public static extern void GetResult(double resultLine);
}

или установите соглашение о вызовах на __stdcall на стороне C ++ (если вам не нужен vararg *, 1017 * также немного более эффективен, чем __cdecl).

2 голосов
/ 06 апреля 2011

У вас несоответствие соглашений о вызовах, cdecl с одной стороны и stdcall с другой. Сделайте так, чтобы они совпадали, и вы должны вернуться в дело.

...