-1

呼び出すac#ラッパーを作成するにはどうすればよいですか:

  [DllImport("FirewallAPI.dll")] 
        internal static extern uint NetworkIsolationEnumAppContainers(out uint pdwCntPublicACs, out IntPtr ppACs); 

次のように実行すると、AccessViolationException (保護されたメモリの読み取りまたは書き込みを試行) が発生します。

        uint aux=0;
        IntPtr foo=new IntPtr();
        NetworkIsolationEnumAppContainers(out aux, out foo);

それをマーシャリングする正しい方法は何ですか? ありがとう

4

2 に答える 2

2

あなたの p/invokes はここから削除されたようです: http://blogs.msdn.com/b/fiddler/archive/2011/12/10/fiddler-windows-8-apps-enable-loopback-network-isolation-免除.aspx

その記事には次のように書かれています。

彼らの .NET 宣言 (BUILD カンファレンスの時点) は次のとおりです。

// Call this API to enumerate all of the AppContainers on the system 
[DllImport("FirewallAPI.dll")] 
internal static extern uint NetworkIsolationEnumAppContainers(
    out uint pdwCntPublicACs, out IntPtr ppACs); 
....

ただし、リリース前に API が変更されました。リリースされたバージョンの API には追加のパラメーターがあり、別の DLL に配置されています。ドキュメントはMSDNにあります。

この API を使用するには、p/invoke を変更する必要があります。

于 2013-04-17T09:58:31.153 に答える
0

最新の API への正しいポインタをありがとう。現在動作しているコードは次のとおりです。

        uint pdwCntPublicACs = 0;
        IntPtr ppACs = new IntPtr();

        // Pin down variables
        GCHandle handle_pdwCntPublicACs = GCHandle.Alloc(pdwCntPublicACs, GCHandleType.Pinned);
        GCHandle handle_ppACs = GCHandle.Alloc(ppACs, GCHandleType.Pinned);


        uint retval = NetworkIsolationEnumAppContainers((Int32) NETISO_FLAG.NETISO_FLAG_MAX, out pdwCntPublicACs, out ppACs);

        //release pinned variables.
        handle_pdwCntPublicACs.Free();
        handle_ppACs.Free();
于 2013-04-18T13:27:16.330 に答える