Если бы мне пришлось отыграть предположение, вы пытаетесь взять адрес функции MANAGED и передать ее как указатель на функцию NATIVE. Это не сработает вообще. Либо напишите собственный мост (сложнее и, вероятно, без преимущества), либо (и это более простой подход) создайте делегата и используйте Marshal.GetFunctionPointerForDelegate . Не забывайте, что делегат должен оставаться в живых до тех пор, пока нативный код ожидает перезвонить, поэтому вам, скорее всего, нужно его где-то хранить.
О, и все функции внутри класса ref или класса значений являются управляемыми функциями, если это неясно.
[РЕДАКТИРОВАТЬ] Расширяя ответ, чтобы покрыть вопросы в комментариях. Первым шагом является создание соответствующего делегата. Для предоставленной вами функции она будет выглядеть следующим образом:
public delegate void CallbackFuncDelegate(DWORD ddStatus, LPVOID lpParam);
Затем вам нужно создать один:
CallbackFuncDelegate del = gcnew CallbackFuncDelegate(CallbackFunc);
И, как отмечалось ранее, вы должны хранить этот IN в своем классе в качестве члена, чтобы убедиться, что он не исчезает. Наконец, вам нужно получить указатель на функцию и передать его:
MyCo_Device_Register_CallbackFunc((MyCo_Device_CallbackProc) Marshal::GetFunctionPointerForDelegate(del).ToPointer(), 0, 0);
Я думаю, что это охватывает все. Все, что вам нужно, это использовать систему имен пространства; и с тобой все будет в порядке.