ppp.1008 Ответов: 1

Установите функцию обратного вызова в библиотеке C равной функции C#


Это dll-драйвер для аппаратного устройства.

Для реализации они дали пример программирования на языке Си, сославшись на то, что я реализую его на языке c#.

Следующий код находится в DLL (C).
extern void (*NdProcSamples)(word dc, word phase, word sum_st, const NdPackChan *chans);

В Примере C они сделали это, как показано ниже, и я хочу, чтобы это было реализовано в c#

В приведенном ниже коде адрес функции NdprocSamples(from DLL) задается в переменной указателя, поэтому драйвер может перезванивать внутренне.

typedef void (*TProcSamples)(word dc, word phase, word sum_st, const NdPackChan *chans); //Call back Fucntion

TProcSamples *pProcSamples;

pProcSamples = (TProcSamples*) GetProcAddress(drv_lib, "NdProcSamples") //Gets address of function

*pProcSamples = NdProcSamples;

//Bleow gunction gets called by driver(DLL)

void NdProcSamples(word dc, word phase, word sum_st, const NdPackChan *chans)
{

//logic goes here 

}


Что я уже пробовал:

Моя реализация в c# приведена ниже, но она не работает-это правильный путь, в котором я не уверен.

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
    unsafe public delegate void DelNDProSamples(word dc, word phase, word sum_st, ref  NdPackChan chans);
IntPtr  NdProcSampleAddress=WinApi.GetProcAddress("cpp.Dll","NdProcSamples");
 DelNDProSamples CallBackDelegate = (DelNDProSamples)Marshal.GetDelegateForFunctionPointer(NdProcSampleAddress, typeof(DelNDProSamples));
            CallBackDelegate(NdProcSamples);

1 Ответов

Рейтинг:
2

KarstenK

Я думаю, что ваша dll не является COM-интерфейсом, поэтому маршаллинг-это не тот инструмент. Правильный подход описан в этой статье статья.

Но решение проблемы заключается в импорте библиотеки dll в среду выполнения C#. Взгляните на мою статью Вызов всех станций который демонстрирует использование библиотеки dll C и обратных вызовов.