(编辑:已解决,解决方案很简单 - 在2008SP1中构建,使用生成的Interop.NetFwTypeLib.dll并将其用作第三方程序集。感谢Rick Sladkey。)
我已经将一些COM对象的代码升级到VS 2010.仍然在.Net 3.5上
从那时起,构建被打破:(The type or namespace name 'INetFwMgr' could not be found (are you missing a using directive or an assembly reference?)
)...
我找到了Microsoft bug,有人说:
SDK 4.0 tlbimp.exe总是导入 第一个,它不遵循 正确的流。即使你手动 调用tlbimp.exe并给出正确的 路径。这是该事业的根本原因 问题。任何COM dll都驻留在 非默认流将具有相同的 tlbimp.exe为4.0的问题。
然后是:
SDK 3.5 tlbimp.exe没有这个 问题。解决方法是使用3.5 tlbimp.exe手动导入 Interop组装从完整路径为 它存储在注册表中 参考这个Interop程序集 你的项目。
有人可以解释一下解决方法吗? (我尝试了明显的tlbimp COM_DLL /out=OUT_DLL
,没有好处)。
有人遇到过另一个COM吗?
谢谢!
注意:XP ...
还有另一个注意事项:尝试VS2010 SP1,没有运气。
代码(部分......):
using NetFwTypeLib;
namespace Utils
{
public class MSFirewall
{
private const string CLSID_FIREWALL_MANAGER = "{304CE942-6E39-40D8-943A-B913C40C9CD4}";
private NetFwTypeLib.INetFwMgr GetFirewallManager()
{
Type objectType = Type.GetTypeFromCLSID(new Guid(CLSID_FIREWALL_MANAGER));
return Activator.CreateInstance(objectType) as NetFwTypeLib.INetFwMgr;
}
}
}
答案 0 :(得分:3)
您的VS2010解决方案可以成功利用互操作库,例如:
使用实用程序VS2008解决方案生成,或使用较旧的SDK工具手动创建。
如果您正在使用源代码控制,那么只需使用VS2008生成一次interop库并将其签入,然后将VS2010解决方案中的引用添加到已签入的互操作库中,而不是导航到COM组件。
答案 1 :(得分:2)
当我们尝试合并一个引用此COM对象的项目时,我们遇到了同样的问题。
在装有Windows 7 x64和VS 2010的计算机上,它编译得很好。 在使用Win2003 x64和VS 2010(其中包含相同项目)的计算机上,我们遇到了编译错误“无法找到类型或命名空间名称'INetFwMgr'。”
我所做的最快 - 我将构建输出设置为“详细”。我观察到了这个命令:
"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\TlbImp.exe" C:\WINDOWS\SysWOW64\hnetcfg.dll /namespace:NetFwTypeLib /out:"obj\Debug WF\Interop.NetFwTypeLib.dll" /sysarray /transform:DispRet /reference:D:\Projects\Framework\Projects\FrameworkBase\Dlls\KellermanSoftware.NET-Email-Validation.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll /reference:"C:\Program Files (x86)\TestDriven.NET 2.0\NUnit\2.4\nunit.framework.dll" /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.configuration.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.DirectoryServices.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Management.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Runtime.Remoting.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Runtime.Serialization.Formatters.Soap.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.ServiceProcess.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Web.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Web.Services.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /reference:D:\Projects\Framework\Projects\Common\ZipLib\bin\Debug\ZipLib.dll /reference:C:\WINDOWS\assembly\GAC\stdole\7.0.3300.0__b03f5f7f11d50a3a\stdole.dll /keyfile:StrongKey.snk
并且此命令的结果很好 - 它生成文件
"D:\Projects\Framework\Projects\FrameworkBase\obj\Debug WF\Interop.NetFwTypeLib.dll"
在Windows 7计算机上生成相同的文件。但是,有一个区别:
文件Interop.NetFwTypeLib.dll
的大小非常不同。
在我看来,Windows 7计算机和Windows 2003 x64计算机上的文件hnetcfg.dll有太多不同,不幸的是,Windows 2003文件中的导入表已损坏。
我不知道微软是否已修复此问题,如果在某些Windows更新中,他们将使用正常的导入表提交正常的hnetcfg.dll。我不在乎他们。
我接下来做了什么:我在Windows 7上获得了一个正常的Interop.NetFwTypeLib.dll,并将其包含在项目的单独文件夹中,并将其引用到此文件中(而不是引用COM)。问题解决了。