gpt4 book ai didi

c# - 无法使用 STAThread 属性转换类型为 'System.__ComObject' 的 COM 对象

转载 作者:行者123 更新时间:2023-11-30 23:25:30 24 4
gpt4 key购买 nike

我编写了一个使用防火墙 COM 库 Interop.NetFwTypeLib 来管理 TCP 传输规则的 Windows 服务。在两台机器上部署不报告问题,但我最近在另一台计算机上安装它并收到异常:

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 设置为这段代码的 Main 方法来测试我是否解决了问题,但没有任何解决方案:

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,尽管注册表可能不一致似乎有点危险?

最佳答案

感谢@Hans 的评论,我可以写下这个答案。

阅读 MSDN 上的文档后:

我找到了每个接口(interface)支持的最低客户端和服务器。

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.
}

如果您不需要 INetFwRule2INetFwRule3 的额外功能,您可以在您的应用程序上降级到 INetFwRule

关于c# - 无法使用 STAThread 属性转换类型为 'System.__ComObject' 的 COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37214753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com