dllimport C ++ метод для C #. При вызове из C # программа закрывается без сообщения об ошибке

Я хочу скомпилировать программу на С ++ в dll и использовать ее из c #.

Это программа на С ++:

MurmurHash3.h MurmurHash3.cpp

Я изменил заголовок и объявление метода в файле h и c ++ из:

void MurmurHash3_x64_128 ( const void * key, int len, uint32_t seed, void * out );

в

extern "C" __declspec(dllexport) void MurmurHash3_x64_128
(const void * key, const int len, const uint32_t seed, void * out )

Я сделал то же самое для всех трех методов. Затем я установил цель компиляции в dll. После компиляции у меня был x64-битный dll с именем SMHasher.dll. Теперь я создал новую 64-битную C # -программу и использовал эту DLL в качестве ссылки.

Тогда я написал следующее:

[DllImport("SMHasher.dll")]
public static extern void MurmurHash3_x64_128(byte[] valueToHash, int len, uint seed, out byte[] hash);

private void button1_Click(object sender, EventArgs e)
{
byte[] hash;
MurmurHash3_x64_128(new byte[] { 1, 2, 3 }, 3, 0, out hash);
}

При вызове MurmurHash3_x64_128 мое тестовое приложение закрывается без каких-либо сообщений об ошибках.

В чем проблема? И как я могу это решить?

Может быть, проблемы с параметрами C ++? Может быть, «const void * key» не является байтовым массивом?

0

Решение

Эта ошибка возникает из-за того, что вы 64-битное приложение, импортирующее 32-битную DLL, или 32-битное приложение, импортирующее 64-битную DLL.

Удостоверьтесь, что вы загружаете библиотеку dll с той же самой битностью вашего приложения.

В C # вы можете установить битность вашего приложения, используя свойства конфигурации в Visual Studio.

1

Другие решения

Пожалуйста, будьте осторожны с соглашениями о вызовах.

В c / c ++ cdecl используется по умолчанию. Но в [DllImport] C # это стандартный вызов.

Попробуйте определить вашу функцию C ++ следующим образом:

void __stdcall MurmurHash3_x64_128 ( const void * key, int len, uint32_t seed, void * out );

И вам лучше использовать файл .def, чтобы убедиться, что имя функции не изменилось.

И еще одна вещь, вы не выделяли память для вашего byte[] hash; возможно это вызывает повреждение стека …

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector