Я написал службу 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))
После чтения этой должности:
- Exception from HRESULT: 0x80004002 (E_NOINTERFACE)
- Why cannot I cast my COM object to the interface it implements in C#
- InvalidCastException , 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, хотя это немного опасно для возможных несоответствий в реестре?
Это простое объяснение, интерфейс INetFwRule3 был добавлен в Windows 8 и Server 2012. Не знаю, что такое «Windows Server 2011», но это, безусловно, отключено на 1. Вам нужно ограничить себя INetFwRule2 или Меньше. Fwiw, ключ HKCR \ CLSID является родиной классов, а не интерфейсом. –
Я попробую с вашей рекомендацией, и знаете ли вы ограничение ОС для интерфейса INetFwRule2? – Joseph
Просто RTFM, посмотрите на нижнюю часть статьи MSDN для интерфейса. –