2013-04-16 2 views
0

Как я могу создать переменного тока # обертка для звонка:C# обертка для NetworkIsolationEnumAppContainers

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

Каков правильный путь для Маршалла? Благодаря

+0

Привет, Вы используете .NET 4.0? –

+0

Вы указали только одну сторону интерфейса. Вы не можете задавать такой вопрос. Вам нужно показать обе стороны. Единственная функция, которую я нашел с этим именем, имеет три параметра и живет в другой DLL. Вы пишете эту DLL? И я призываю вас прекратить именовать переменные 'foo'. Используйте настоящее имя. –

+0

Они определены здесь: http://blogs.msdn.com/b/fiddler/archive/2011/12/10/fiddler-windows-8-apps-enable-loopback-network-isolation-exemption.aspx –

ответ

1

Ваш р/вызывающую, по всей видимости, были сняты здесь: 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/invoke для использования этого API.

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(); 
+0

' Вызов GCHandle.Alloc не имеет смысла, поскольку вы не можете привязывать локальные переменные, а только объекты. Вы должны уметь их удалить. – dtb

Смежные вопросы