Я пытаюсь выполнить некоторые методы (в данном конкретном случае, rdOnAllDone) из сторонней библиотеки DLL, написанные на C, и глядя через файлы заголовков, я нашел это:Правильный способ вызова C 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-метод?
EDIT: Забыл добавить Основной метод:
public static void Main()
{
rdOnAllDoneCallbackDelegate del3 = new rdOnAllDoneCallbackDelegate(rdOnAllDoneCallback);
rdOnAllDone(del3);
while (true)
{
Thread.Sleep(1000);
}
}
Пробовал, что прямо сейчас, и делегат еще называют дважды, и он выходит из строя программу с той же ошибкой "vshosts32.exe остановилась рабочий " –
Вы правы, я попробовал и испытал то же самое. После небольшого поиска в Google я нашел рабочее решение и обновил сообщение. :) –