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

NS.*_*.X. 5 com-interop regfreecom

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

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

  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>
    
    Run Code Online (Sandbox Code Playgroud)
  5. 构建并运行。

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

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

NS.*_*.X. 5

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

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

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

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

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

  • 您刚才不是说您想*不*注册就这样做吗? (2认同)
  • @Arafangion 我希望用户无需 COM 注册即可使用该应用程序。该解决方案需要在可接受的开发机器上注册。 (2认同)