将C / C ++函数导入C#

时间:2012-10-29 20:08:13

标签: c# c++ c

我有一些C代码,将使用P / Invoke从C#调用。我正在尝试为这个C函数定义一个C#等价物。

SomeData* DoSomething();

struct SomeData
{
    ...
}

如何将此C方法导入C#?我无法定义函数的返回类型。

修改 我有一堆函数要导入。这是让我卡住的一个。

[DllImport("SomeDll.dll")]
public static extern IntPtr DoSomething();

我想过使用IntPtr,即使它之后的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

我不太确定我理解你的问题,但我会尽力回答。您需要定义从C函数返回的结构,并使用Marshal.PtrToStructure来使用返回的结构。

[DllImport("SomeDll.dll")]
public static extern IntPtr DoSomething();

public struct SomeData
{
    //...
}

//code to use returned structure
IntPtr result = DoSomething();

SomeData structResult = (SomeData)Marshal.PtrToStructure(result, typeof(SomeData));

答案 1 :(得分:3)

我猜你正在努力实现的目标如下:

  1. 您的C / C ++本机方法不接受任何参数,并返回指向结构的指针。
  2. C#等价物是返回一个IntPtr(指针)。
  3. 问题是您无法将IntPtr解析为C#

    中的结构

    ...研究这个:

    Marshal.PtrToStructure(IntPtr,Type)

    http://msdn.microsoft.com/en-us/library/4ca6d5z7.aspx

    您可以像这样包装代码

    public static class UnsafeNativeMethods
    {
       [DllImport("SomeDll.dll")]
       private static extern IntPtr DoSomething(); //NO DIRECT CALLS TO NATIVE METHODS!!
    
       public static SomeData SafeDoSomething()
       {
          try
          {
             return (SomeData)Marshal.PtrToStructure(DoSomething(), typeof(SomeData));
          }
          catch(Exception ex)
          {
             //handle exception
          }
       }
    }