Невозможно привести объект COM типа "Система.__ComObject" с атрибутом STAThread.
Я написал службу Windows, которая использует библиотеку COM брандмауэра Interop.NetFwTypeLib
управлять правилами для передачи по TCP. Развертывания на двух компьютерах не сообщают о проблемах, но я недавно установил их на другом компьютере и получаю исключение:
Невозможно преобразовать COM-объект типа "System.__ComObject" в интерфейсный тип "NetFwTypeLib.INetFwRule3". Эта операция завершилась неудачно, поскольку вызов QueryInterface в компоненте COM для интерфейса с IID '{B21563FF-D696-4222-AB46-4E89B73AB34A}' не выполнен из-за следующей ошибки: такой интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE))
После прочтения этого поста:
- Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)
- Почему я не могу привести мой COM-объект к интерфейсу, который он реализует в C#
- InvalidCastException, исключение из 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 ответ
Я могу написать этот ответ благодаря комментариям @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
,