我有一个作为第三方 API 的一部分提供的 TLB。我使用 TBIMP.exe 生成 DLL 程序集包装器。但是,在开发时,该程序集似乎需要注册 regsvr32 才能使用。
然而,这在开发时不是问题;我在生产中使用托管实例,并且在部署时手动注册 DLL 会很痛苦,如果不是不可能的话。有没有办法以在部署期间不需要注册步骤的方式使用托管 DLL 程序集?
我一直在网上阅读,发现一些关于使用 app.manifest 的免注册 COM 的文献。这可能是一个可行的解决方案吗?
我有一个作为第三方 API 的一部分提供的 TLB。我使用 TBIMP.exe 生成 DLL 程序集包装器。但是,在开发时,该程序集似乎需要注册 regsvr32 才能使用。
然而,这在开发时不是问题;我在生产中使用托管实例,并且在部署时手动注册 DLL 会很痛苦,如果不是不可能的话。有没有办法以在部署期间不需要注册步骤的方式使用托管 DLL 程序集?
我一直在网上阅读,发现一些关于使用 app.manifest 的免注册 COM 的文献。这可能是一个可行的解决方案吗?
如果类型库也嵌入了您的第 3 方 COM DLL,那么独立 COM确实可以用于此目的(您可以使用 OleView 进行验证)。使用 VS2010/2012 以这种方式使用 COM DLL 非常容易。DLL 必须在开发机器上注册。然后您只需将其添加为您的 .NET 项目的引用并打开其Embed Interop Types
和Isolated
属性:
互操作程序集将与使用的 .NET 程序集合并,您只需确保在部署时将 COM DLL、.NET 程序集和生成的.manifest文件复制到一起。
考虑客户端应用程序的 COM 公寓模型非常重要。STA 客户端应该没有问题。但是,对于 MTA 模型,默认的基于 typelib 的编组器可能不适用于由隔离 DLL 创建的 COM 对象(更多信息请参见此处)。如果 DLL 带有实现的 COM 代理/存根代码,这也不应该是一个问题。
可悲的是没有。您的目标 DLL 是一个 COM DLL,因此,必须在它部署到的每个盒子上注册。好消息是,假设您正在构建一个用于部署的安装包,大多数值得一提的安装程序工具集应该支持开箱即用的 COM 注册。检查安装程序的文档。
如果你要部署xcopy
到大量的盒子,我想说是时候重新考虑你的策略了。您可能会对此感到唯一的安慰是,COM DLL 只需为每个盒子、每个部署的版本注册一次。但是,如今,xcopy
安装通常不是一个好主意。
更新:我的立场是正确的——我投票赞成 Noseratio。说明这些天我很少关注 COM 集成。