编组C ++类作为结构

时间:2012-01-28 13:20:41

标签: c# interop pinvoke

在C ++方面,我有以下类声明:

class MyClass {
    ...fields
    MyClass();
    ~MyClass(); };

此类用于dll中的某些方法。它传递给他们并从他们返回。 我怎样才能在C#中表示它?我需要使它与C ++ DLL完全兼容。

这个类没有方法只有无参数构造函数和析构函数被定义。任何想法如何编组呢?不幸的是,我不能使用C ++ \ CLI,但我希望可以用C#来实现。

我只有一个想法是将它表示为C#端的结构(不幸的是我无法访问C ++代码)并尝试使用Marshal.PtrToStructure。但我不确定它会起作用。

有什么建议吗?谢谢。

1 个答案:

答案 0 :(得分:1)

这在C#中实际上是不可能的。它可以映射托管和本机之间的数据,而不是行为。 C ++类本身就提供了行为,因此无法直接编组。

您可以做的是将IntPtr封送到本机对象并创建一个仅使用IntPtr访问该类型的数据片段的瘦PInvoke层。例如,假设我有以下C ++类。

class MyClass {
public:
  int Field;
};

我可以使用以下一组C函数公开它的行为。

extern "C" {

  void* MyClass_Create() {
    return new MyClass();
  }

  void MyClass_Delete(void* pValue) {
    delete reinterpret_cast<MyClass*>(pValue);
  }

  int MyClass_GetField(void* pValue) {
    return reinterpret_cast<MyClass*>(pValue)->Field;
  }

  void MyClass_SetField(void* pValue, int field) {
    reinterpret_cast<MyClass*>(pValue)->Field = field;
  }
}

现在我通过C函数公开了这个,我可以在它上面创建一个瘦管理包装器

internal static class NativeMethods {
  [DllImport("example.dll")]
  internal static extern IntPtr MyClass_Create();

  [DllImport("example.dll")]
  internal static extern void MyClass_Destroy(IntPtr ptr);

  [DllImport("example.dll")]
  internal static extern int MyClass_GetField(IntPtr prt);

  [DllImport("example.dll")]
  internal static extern void MyClass_SetField(IntPtr ptr, int field);
}


public class MyClass : IDisposable {
  private readonly IntPtr m_pointer;

  public int Field {
    get { return NativeMethods.MyClass_GetField(m_pointer); }
    set { NativeMethods.MyClass_SetField(m_pointer, value); }
  }

  public MyClass() {
    m_pointer = NativeMethods.MyClass_Create();
  }

  // Create from existing 
  public MyClass(IntPtr pointer) {
    m_pointer = pointer;
  }

  public void Dispose() {
    NativeMethods.MyClass_Destroy(m_pointer);
  }
}