【问题标题】:Wrap c++ function that needs function pointer包装需要函数指针的c++函数
【发布时间】:2014-09-30 15:29:48
【问题描述】:

我有一个external 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 做什么,但我不知道该怎么做,而且这次谷歌没有帮助我!

【问题讨论】:

标签: c# dll interop pinvoke wrapper


【解决方案1】:

您可以使用委托代替函数指针。

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

【讨论】:

  • 这看起来不错,但我如何定义“GenericFunction”的作用?我需要用某种委托声明?
  • @HypeZ 就像您使用其他代表一样。创建一个具有相同签名的函数并将该函数的名称传递给NativeFunction
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
相关资源
最近更新 更多