-4

P/Invoke を使用して C# から呼び出される 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 に答える