-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);

Marshall的正确方法是什么?谢谢

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上找到。

您需要修改您的 p/invoke 以使用此 API。

于 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 回答