NetworkIsolationEnumAppContainers的c#包装器

本文关键字:包装 NetworkIsolationEnumAppContainers | 更新日期: 2023-09-27 18:09:26

如何创建一个c#包装器来调用:

  [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的正确方法是什么?由于

NetworkIsolationEnumAppContainers的c#包装器

您的p/调用似乎已经从这里解除:http://blogs.msdn.com/b/fiddler/archive/2011/12/10/fiddler-windows-8-apps-enable-loopback-network-isolation-exemption.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/调用来使用这个API

感谢最新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();