Я хочу скомпилировать программу на С ++ в dll и использовать ее из c #.
Это программа на С ++:
Я изменил заголовок и объявление метода в файле 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» не является байтовым массивом?
Эта ошибка возникает из-за того, что вы 64-битное приложение, импортирующее 32-битную DLL, или 32-битное приложение, импортирующее 64-битную DLL.
Удостоверьтесь, что вы загружаете библиотеку dll с той же самой битностью вашего приложения.
В C # вы можете установить битность вашего приложения, используя свойства конфигурации в Visual Studio.
Пожалуйста, будьте осторожны с соглашениями о вызовах.
В c / c ++ cdecl используется по умолчанию. Но в [DllImport] C # это стандартный вызов.
Попробуйте определить вашу функцию C ++ следующим образом:
void __stdcall MurmurHash3_x64_128 ( const void * key, int len, uint32_t seed, void * out );
И вам лучше использовать файл .def, чтобы убедиться, что имя функции не изменилось.
И еще одна вещь, вы не выделяли память для вашего byte[] hash;
возможно это вызывает повреждение стека …