2016-05-13 3 views
1

Я написал службу Windows, которая использует библиотеку COM-сервера Firewall Interop.NetFwTypeLib для управления правилами передачи TCP. Развертываний на две машины не сообщают о проблемах, но установить его в последнее время на другом компьютере и получить исключение:Невозможно лить COM-объект типа «System .__ ComObject» с атрибутом STAThread

Unable to cast COM object of type 'System.__ComObject' to interface type 'NetFwTypeLib.INetFwRule3'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{B21563FF-D696-4222-AB46-4E89B73AB34A}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE))

После чтения этой должности:

Я установил STAThreadAttribute к основной методе этого кода, чтобы проверить, если с этим я решить эту проблему, но без какого-либо решения:

class Program 
{ 
    [STAThread] 
    static void Main(string[] args) 
    { 
     try{ 
      var type = Type.GetTypeFromProgID("HNetCfg.FWRule"); 
      var instance = (INetFwRule3) Activator.CreateInstance(type); 

      Console.WriteLine("OK"); 
     } 
     catch (Exception exception){ 
      Console.WriteLine(exception); 
     } 
    } 
} 

Я был удивлен, пошел я запускаю этот скрипт, чтобы найти CLSID о реестре, и не возвращаюсь любой результат на обоих компьютерах, где работает и не работает .:

reg query HKCR\CLSID | find /i "{B21563FF-D696-4222-AB46-4E89B73AB34A}" 

это информация с компьютера, на котором работает сервис:

**OS** 
Windows Server 2012 R2 Standard 

**FirewallAPI.dll file on Windows/system32** 
File version: 6.3.9600.17415 
Product version: 6.3.9600.17415 
Size: 736 kb 
Date modified: 4/28/2015 8:51 PM 

информация с компьютера, где служба не:

**OS** 
Windows Server 2011 Service Pack 1 

**FirewallAPI.dll file on Windows/system32** 
File version: 6.1.7600.16385 
Product version: 6.3.7600.16385 
Size: 730 kb 
Date modified: 7/13/2009 8:51 PM 

ВОПРОСЫ:

  • Это может быть разница в версии FirewallAPI.dll, что вызывает проблему?
  • Если бы этого было достаточно, чтобы обновить dll, хотя это немного опасно для возможных несоответствий в реестре?
+1

Это простое объяснение, интерфейс INetFwRule3 был добавлен в Windows 8 и Server 2012. Не знаю, что такое «Windows Server 2011», но это, безусловно, отключено на 1. Вам нужно ограничить себя INetFwRule2 или Меньше. Fwiw, ключ HKCR \ CLSID является родиной классов, а не интерфейсом. –

+0

Я попробую с вашей рекомендацией, и знаете ли вы ограничение ОС для интерфейса INetFwRule2? – Joseph

+1

Просто RTFM, посмотрите на нижнюю часть статьи MSDN для интерфейса. –

ответ

1

Я могу написать этот ответ благодаря комментариям @Hans.

После чтения документации на MSDN по:

Я нашел минимальный поддерживаемый клиент и сервер для каждого интерфейса.

var osVersion = Environment.OSVersion.Version; 

if(osVersion.Major < 6) 
    throw new Exception("INetFwRule is not available for current OS version. Minimun OS version required is Windows Vista or Windows Server 2008."); 

if (osVersion.Major == 6) 
{ 
    switch (osVersion.Minor) 
    { 
     case 0: 
      //INetFwRule is available. Windows Server 2008 or Windows Vista 
      break; 
     case 1: 
      //INetFwRule2 is available. Windows 7 or Windows Server 2008 R2 
      break; 
     default: 
      //INetFwRule3 is available. Windows 8.1, Windows Server 2012 R2, Windows 8 or Windows Server 2012. 
      break; 
     } 
    } 
    else 
    { 
     //INetFwRule3 is available. Windows Server 2016 Technical Preview or Windows 10. 
    } 

Вы можете вернуться к INetFwRule на приложение, если вам не нужны дополнительные функции в INetFwRule2 или INetFwRule3.