包装需要函数指针的c ++函数

时间:2014-09-30 15:29:48

标签: c# dll interop pinvoke wrapper

我有外部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这次没有帮助我!

1 个答案:

答案 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);