Я пытаюсь выполнить некоторые методы (в данном конкретном случае, rdOnAllDone) из сторонней библиотеки DLL, написанной на C, и просматривая файлы заголовков, я нашел это:
#ifndef TDECLSDONE
#ifdef STDCALL
#define CCON __stdcall
#else
#define CCON __cdecl
#endif
#define TDECLSDONE
#endif
#define DLLIMP __declspec (dllimport)
DLLIMP int CCON rdOnAllDone (void(CCON *)(int));
Послепытаясь найти способ вызова этого метода, я сделал это:
[DllImport("sb6lib.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int rdOnAllDone(Delegate d);
public delegate void rdOnAllDoneCallbackDelegate();
private static void rdOnAllDoneCallback()
{
Console.WriteLine("rdOnAllDoneCallback invoked");
}
Метод был вызван правильно, за исключением того, что я не смог получить параметр int.Поэтому я попытался добавить входной параметр int следующим образом
[DllImport("sb6lib.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int rdOnAllDone(Delegate d);
public delegate void rdOnAllDoneCallbackDelegate(int number);
private static void rdOnAllDoneCallback(int number)
{
Console.WriteLine("rdOnAllDoneCallback invoked " + number);
}
Но теперь делегат вызывается дважды, и он вылетает из программы со следующей ошибкой «vshosts32.exe перестал работать»
Чтоправильный способ вызова этого метода DLL?
РЕДАКТИРОВАТЬ: Забыли добавить метод Main:
public static void Main()
{
rdOnAllDoneCallbackDelegate del3 = new rdOnAllDoneCallbackDelegate(rdOnAllDoneCallback);
rdOnAllDone(del3);
while (true)
{
Thread.Sleep(1000);
}
}