6

C# を使用して DLL 関数を呼び出しています。

[DllImport("MyDLL.dll", SetLastError = true)]
public static extern uint GetValue(
        pHandle handle,
        ref somestruct a,
        ref somestruct b);

null引数 3 の参照を渡すにはどうすればよいですか?

試してみると、コンパイル時エラーが発生します。

<null>から参照 somestruct に変換できません。

私も試しIntPtr.Zeroました。

4

4 に答える 4

6

次の 2 つのオプションがあります。

  1. クラスsomestructを作成し、関数のシグネチャを次のように変更します。

    [DllImport("MyDLL.dll", SetLastError = true)]
    public static extern uint GetValue(
        pHandle handle, somestruct a, somestruct b);
    

    通常、これは a をandnullの値として渡すことができることを除いて、他のものを変更してはなりません。ab

  2. 次のように、関数に別のオーバーロードを追加します。

    [DllImport("MyDLL.dll", SetLastError = true)]
    public static extern uint GetValue(
        pHandle handle, IntPtr a, IntPtr b);
    

    タイプ のオブジェクトにIntPtr.Zeroに加えて、を使用して関数を呼び出すことができるようになりました。refsomestruct

    GetValue(myHandle, ref myStruct1, ref myStruct2);
    GetValue(myHandle, IntPtr.Zero, IntPtr.Zero);
    
于 2013-03-05T06:58:34.163 に答える
0

この回答SomeStructは、クラスを作成することを提案しています。うまく機能するように見えるそのアイデアの実装を示したいと思います... の定義を変更できない場合でもSomeStruct( のような事前定義された型である場合など、この回答System.Guidも参照してください)。

  1. 汎用ラッパー クラスを定義します。

    [StructLayout(LayoutKind.Explicit)]
    public sealed class SomeStructRef
    {
        [FieldOffset(0)]
        private SomeStruct value;
    
        public static implicit operator SomeStructRef(SomeStruct value)
        {
            return new SomeStructRef { value = value };
        }
    }
    

    ここでの基本的な考え方はボクシングと同じです。

  2. 相互運用メソッドの定義を次のように変更します。

    [DllImport("MyDLL.dll", SetLastError = true)]
    public static extern uint GetValue(
        pHandle handle,
        ref SomeStruct a,
        [MarshalAs(UnmanagedType.LPStruct)] SomeStructRef b);
    

3 番目のパラメーターbは「nullable」になります。は参照型なのでSomeStructRef、参照を渡すことができnullます。SomeStruct暗黙の変換演算子 from SomeStructtoが存在するため、値を渡すこともできSomeStructRefます。そして (少なくとも理論上は) [StructLayout]/の[FieldOffset]マーシャリング命令により、 のインスタンスは .SomeStructRefの実際のインスタンスと同じようにマーシャリングされるはずですSomeStruct

相互運用の専門家である誰かがこの技術の健全性を検証できれば幸いです。

于 2015-05-17T21:36:58.503 に答える