Я создал DLL-файл, который включает в себя две пустые функции ниже.stdcall вызов конвенции и использование pinvoke в C#
extern "C" __declspec(dllexport) void __stdcall myFunc1() {
// just empty function
}
extern "C" __declspec(dllexport) void __cdecl myFunc2() {
// just empty function
}
В C#, я мог вызывать функции с помощью DLLImport
атрибута, как показано ниже.
[DllImport("myDLL", CallingConvention=CallingConvention.StdCall)]
private extern static void myFunc1();
[DllImport("myDLL", CallingConvention=CallingConvention.Cdecl)]
private extern static void myFunc2();
Так что я снова попытался непосредственно LoadLibrary()
из kernel32.dll вместо DllImport
атрибута.
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate void MyFunc1();
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void MyFunc2();
Однако ошибка времени выполнения происходит, когда я звоню MyFunc1() где MyFunc2() работает.
Так что я заменил __stdcall
на __cdecl
на C++, перекомпилировал DLL, а затем снова вызвал MyFunc1() на C#.
И .. Это сработало.
Почему на земле не работает __stdcall вызов конвенции с pinvoke в C#?
'DllImport' * есть * P/Invoke. Что вы пытаетесь сделать на земле? : D 'UnmanagedFunctionPointer' обрабатывает управляемый делегат как неуправляемый указатель функции (как следует из названия) - он не имеет ничего общего с вызовом неуправляемой функции в DLL. Хорошо, а не «ничего» - очевидно, у вас есть делегат, который вы можете передать или получить с неуправляемой стороны, но это не то, что вы пытаетесь сделать здесь. – Luaan
Также, согласно документации для 'UnmanagedFunctionPointer',' если вы не указали имя поля, UnmanagedFunctionPointerAttribute игнорируется. '- Я не вижу, чтобы вы указали какое-либо имя. – Luaan
Да, ты прав. На этот раз я использую LoadLibrary(), FreeLibrary() и GetProcAddress() для "kernel32.dll". Я не опубликовал остальную часть кода, потому что я думал, что это просто базовая вещь для опытных парней. – Jenix