【问题标题】:VS2010 COM interop bug workaround? (INetFwMgr)VS2010 COM 互操作错误解决方法? (INetFwMgr)
【发布时间】:2011-08-04 22:06:15
【问题描述】:

编辑:已解决,解决方案很简单 - 在 2008SP1 中构建,获取生成的 Interop.NetFwTypeLib.dll 并将其用作第 3 方程序集。感谢 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 并给出正确的 小路。这是造成这种情况的根本原因 问题。任何驻留在 非默认流将具有相同的 4.0 的 tlbimp.exe 存在问题。

然后是:

SDK 3.5 tlbimp.exe 没有这个 问题。解决方法是使用 3.5 tlbimp.exe 手动导入 来自完整路径的互操作程序集 它存储在注册表中,并且 在中引用此互操作程序集 你的项目。

有人可以解释解决方法吗? (我尝试了明显的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;
        }


    }
}

【问题讨论】:

    标签: c# .net visual-studio-2010


    【解决方案1】:

    您的 VS2010 解决方案可以成功利用互操作库,例如:

    • Interop.NetFwTypeLib.dll

    使用实用程序 VS2008 解决方案生成或使用较旧的 SDK 工具手动创建。

    如果您使用源代码管理,则只需使用 VS2008 生成互操作库一次并将其签入,然后将 VS2010 解决方案的引用添加到签入的互操作库,而不是导航到 COM 组件。

    【讨论】:

    • 就像我提到的,我用 2008 命令提示符尝试了tlbimp COM_DLL /out=OUT_DLL,引用了那个 dll - 不好。我做错了吗?
    • 您正在为自己创作作品!在将您的项目移植到 VS2010 之前,您的 obj 文件夹中有一个非常好的 Interop.NetFwTypeLib.dll。就用那个吧。
    【解决方案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 机器上的 hnetcfg.dll 文件和 Windows 2003 x64 机器上的文件差别太大了,不幸的是,Windows 2003 文件中的导入表已损坏。

    我不知道 Microsoft 是否已修复此问题,以及是否在某些 Windows 更新中他们会提交带有正常导入表的正常 hnetcfg.dll。我不在乎他们。

    接下来我要做的是:我在 Windows 7 上获得了一个普通的 Interop.NetFwTypeLib.dll 并将其包含在项目的单独文件夹中并放入源代码控制中,并将我对这个文件的引用(而不是对 COM 的引用)。问题就解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 2011-05-12
      • 2012-02-23
      • 2017-03-20
      相关资源
      最近更新 更多