-4

我有一些 C 代码将使用 P/Invoke 从 C# 调用。我正在尝试为此 C 函数定义 C# 等效项。

SomeData* DoSomething();

struct SomeData
{
    ...
}

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

编辑: 我有一堆功能要导入。这是让我陷入困境的一个。

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

我考虑过使用 IntPtr,即使它是正确的,那之后呢?

4

2 回答 2

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));
于 2012-10-29T20:31:23.057 回答
3

我猜你想要达到的目标如下:

  1. 您的 C/C++ 本机方法不接受参数并返回指向结构的指针。
  2. C# 等效项是返回一个 IntPtr(指针)。

问题是您无法将 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
      }
   }
}
于 2012-10-29T20:33:04.800 回答