6

我想向我的 .NET 应用程序添加免注册 COM 引用。免注册意味着用户无需将 COM 组件注册到他们的系统即可运行应用程序。

我找到了很多关于这个主题的文章(例如MSDN这个 S/O question等),但没有一个包含具体步骤。这是我尝试过但没有奏效的方法:

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

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

错误提示应用程序配置不正确。<assemblyIdentity>在没有运气的情况下尝试了不同的值。

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

4

2 回答 2

5

汉斯的答案有正确的信息,但当我第一次阅读它时我不清楚该怎么做。在尝试了许多不同的事情之后,我终于让它工作了,而且非常简单:

  1. 在开发者机器上注册 COM 类。
  2. 在应用程序项目中,添加 COM 引用。
  3. 在参考属性中,设置这些:
    • 隔离 = 真
    • 复制本地 = True
    • Embed Interop Types = False(Hans 在评论中指出这是不必要的,但我尚未验证)

通过执行这些步骤,将interop.foo.dll自动生成应用程序清单。这允许用户无需注册即可使用 COM 组件。

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

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

于 2012-06-02T05:10:54.857 回答
3

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

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

使用可以在任何机器上使用的已知良好的 COM 服务器来执行此操作很有用。从控制台应用程序项目模板创建一个新项目。项目 + 添加引用,浏览选项卡,选择 c:\windows\system32\shell32.dll。选择添加的 Shell32 引用并将其独立属性更改为 True。构建+重建。

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

于 2012-06-01T23:56:36.440 回答