在.NET中注册免费COM互操作的确切步骤(在没有regsvr32的情况下调用复制的COM dll)

时间:2012-06-01 22:59:42

标签: com-interop regfreecom

我想在我的.NET应用程序中添加一个免注册的COM引用。免注册意味着用户无需在其系统中注册COM组件即可运行应用程序。

我发现了很多关于这个主题的文章(例如MSDNthis S/O question等),但没有一篇包含具体步骤。这是我尝试过但没有用的东西:

  1. 使用mt.exe生成COM dll的清单(例如foo.dll),如this answer中所述。
  2. foo.dllfoo.dll.manifest添加到我的应用中,作为“构建操作”=“内容”和“复制到输出目录”=“始终复制”。
  3. 添加对interop.foo.dll附带的foo.dll的引用。
  4. 使用此部分添加应用清单文件:

    <dependency>
      <dependentAssembly>
        <assemblyIdentity type="win32" name="foo" />
      </dependentAssembly>
    </dependency>
    
  5. 构建并运行。

  6. 说应用程序配置不正确时出错。在没有运气的情况下在<assemblyIdentity>中尝试了不同的值。

    有人可以分享经验吗?感谢。

2 个答案:

答案 0 :(得分:4)

汉斯的回答有正确的信息,但我不清楚当我第一次看到它时该做什么。在尝试了许多不同的事情后,我终于开始工作了,这非常简单:

  1. 在开发者计算机上注册COM类。
  2. 在app项目中,添加COM引用。
  3. 在参考属性中,设置以下内容:
    • 隔离=真
    • 复制Local = True
    • 嵌入互操作类型=错(汉斯在评论中指出这是不必要的,但我还没有验证)
  4. 通过执行这些步骤,将自动生成interop.foo.dll和应用清单。这允许用户无需注册即可使用COM组件。

    相反,如果你没有在开发机器上注册COM,你仍然可以通过添加对interop.foo.dll的引用来开发和构建应用程序(可以在注册了COM类的机器上生成)然后复制),但构建结果只能在注册了COM组件的机器上运行。可能有一个解决方案,但需要更深入的了解MSBuild如何使用COM引用,我没有花时间调查。

    简而言之,运行时无注册COM的关键是在开发机器上注册COM类。

答案 1 :(得分:3)

你的清单不正确。它应包含<file>元素而不是<dependentAssembly>元素。使用<comClass>元素声明可创建的共同类。

生成清单是VS构建系统中的内置功能。要使其工作,需要在开发机器上正确安装COM组件。不要尝试一个免注册的COM清单,除非你可以在你的机器上没有它的情况下使它工作,你将打击两个问题而不是一个。因此,对于初学者,请确保使用供应商的安装程序或部署说明正确安装服务器。并确保创建对象并调用方法的测试程序正常运行。

使用可在任何机器上使用的已知良好的COM服务器来执行此操作非常有用。从Console Application项目模板创建一个新项目。 Project + Add Reference,Browse选项卡,选择c:\ windows \ system32 \ shell32.dll。选择添加的Shell32引用并将其Isolated属性更改为True。构建+重建。

查看项目的bin \ Debug构建目录,并使用记事本打开app.exe.manifest文件。观察文件和comClass元素,这也是你所需要的。如果这没有帮助,那么转向COM服务器的所有者,他应该能够为您提供所需的清单。

相关问题