我有外部dll (有关如何使用它的C ++文档),我需要在 C#程序中使用其中的一些函数。
我为一些函数编写了一个小包装器并且它们运行良好,但我不知道如何将需要函数指针的函数包装为参数。
C ++文档说:
uint NativeFunction(uint32 parameter, GenericFunction *func)
由于GenericFunction
应该得到2 * char作为参数,我在C#中写道:
public struct GenericFunction
{
public string param1;
public string param2;
}
[DllImport("externalLib.dll", SetLastError = true)]
public static extern uint NativeFunction(uint parameter, GenericFunction func);
当我需要打电话时,我使用
GenericFunction test = new GenericFunction();
uint result = NativeFunction(0u, test);
有了这个我有这个丑陋的错误:
尝试读取或写入受保护的内存。这通常是一个 表明其他内存已损坏。
我很确定我以错误的方式调用该函数,因为我仍然需要定义GenericFunction
做什么,但我不知道如何做到这一点并且Google这次没有帮助我!
答案 0 :(得分:3)
您可以使用委托代替函数指针。
public delegate void GenericFunction(string param1, string param2);
[DllImport("externalLib.dll", SetLastError = true)]
public static extern uint NativeFunction(uint parameter, [MarshalAs(UnmanagedType.FunctionPtr)]GenericFunction func);