C# 如何在COM应用程序中使用单独部署的.NET程序集

C# 如何在COM应用程序中使用单独部署的.NET程序集,c#,com-interop,typelib,C#,Com Interop,Typelib,我有一个应用程序A,它依赖于另一个应用程序B。除非已存在较新版本的B,否则B将与A一起部署。A在C++和C语言中实现(使用ATL/COM),B在C语言中实现(COM可见,部署时注册)。 我在构建时从B生成类型库(.tlb),并将其导入A的本机DLL。这样我们就可以在A的本机部分使用B。这是可以预期的 然而,我还没有找到一种在a的托管部分直接使用B的好方法。我原以为可以从类型库生成互操作程序集,但tlbimp不允许这样做 类型库“xxx”是从CLR程序集导出的,无法作为CLR程序集重新导入 这个限

我有一个应用程序A,它依赖于另一个应用程序B。除非已存在较新版本的B,否则B将与A一起部署。A在C++和C语言中实现(使用ATL/COM),B在C语言中实现(COM可见,部署时注册)。 我在构建时从B生成类型库(.tlb),并将其导入A的本机DLL。这样我们就可以在A的本机部分使用B。这是可以预期的

然而,我还没有找到一种在a的托管部分直接使用B的好方法。我原以为可以从类型库生成互操作程序集,但tlbimp不允许这样做

类型库“xxx”是从CLR程序集导出的,无法作为CLR程序集重新导入

这个限制对我来说毫无意义。我可以通过为B制作一个本机COM包装器,或者将B的所有接口分离到另一个程序集来解决这个问题,该程序集将与a一起部署(并用于tlb生成),但是……来吧!真的没有办法从托管代码生成互操作程序集吗


有什么建议吗?

Tlbimp.exe生成的互操作程序集只能由托管代码使用。它会创建对象,因为它可以看到DLL已经是托管代码。换句话说,您根本不需要互操作程序集,因为您可以直接使用DLL。在您的a项目中添加对它的引用。@HansPassant如果我在a中只使用B的一小部分,让我们称之为“B.someFeature.dll”,我是否必须将该dll的所有引用部署到a的安装文件夹中?在本机端,使用tlb,“B.someFeature.dll”从其安装文件夹加载,其中也包含其所有依赖项。或者你的意思是我只需要构建一个以“B.someFeature.dll”作为引用的,而不需要将它部署到A的安装文件夹中?