将免注册COM清单嵌入到具有本机/托管环境的C#dll中
我目前正在开发一个混合的本机/托管应用程序链,它使用免注册COM。下图说明了这一点: C#包装DLL是使用tlbimp.exe实用程序创建的。这允许每个C#可执行文件访问COM DLL中的本机类型和方法。COM DLL本身采用基于服务器的RegFree COM清单 当基于客户端的RegFree COM清单嵌入到C#可执行文件中时,一切正常。但是,我想将这些清单文件移动并统一到C#DLL中,这将大大简化版本信息的维护和同步 由于Visual Studio没有提供将清单文件嵌入C#类库的选项,因此我尝试使用清单工具(mt.exe)提取、修改并重新嵌入DLL的默认清单。这似乎起到了作用,因为C#DLL现在在使用mt查询时公开了以下清单:将免注册COM清单嵌入到具有本机/托管环境的C#dll中,c#,.net,com-interop,regfreecom,activation-context-api,C#,.net,Com Interop,Regfreecom,Activation Context Api,我目前正在开发一个混合的本机/托管应用程序链,它使用免注册COM。下图说明了这一点: C#包装DLL是使用tlbimp.exe实用程序创建的。这允许每个C#可执行文件访问COM DLL中的本机类型和方法。COM DLL本身采用基于服务器的RegFree COM清单 当基于客户端的RegFree COM清单嵌入到C#可执行文件中时,一切正常。但是,我想将这些清单文件移动并统一到C#DLL中,这将大大简化版本信息的维护和同步 由于Visual Studio没有提供将清单文件嵌入C#类库的选项,因此
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><assemblyIdentity name="FirstClient" version="1.0.0.0" processorArchitecture="msil"></assemblyIdentity><file name="FirstClient.dll" hashalg="SHA1"></file>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="atl" version="1.0.0.0"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
但是,可执行文件拒绝工作,每个可执行文件都抱怨COM类工厂无法找到丢失的COM模块
这里有我忽略的东西吗?谢谢。我通过PinVo调用适当的激活上下文函数使其正常工作。感谢您的提示。@HansPassant谢谢,我不知道在VS中可以向类库添加清单。关于您的第二句话:是的,如果我可以避免额外的TLB dll,那就太好了。但是,Visual C#dll项目不允许我添加对COM tlb或COM dll本身的引用。它抱怨这些文件不是COM组件。这就是为什么到目前为止我一直依赖TLB包装器。等等,还有一个问题,Windows永远不会在DLL中查找清单。它们不是正常加载的,没有LoadLibrary()调用,因此Windows加载程序没有理由去寻找嵌入的清单。你必须用软件pinvoke CreateActCtx()来完成。同样在.NET中使用,搜索它的参考源。@Aurora您能在您的答案中提供更多关于您是如何做到这一点的信息吗?“我和你有完全相同的问题。@JosephGarrone看一看教程,它很好地描述了API。感谢Aurora的链接,所以你刚才用ActCtx调用包围了C#library中对COM库的所有调用?可能需要再尝试一次。是的,.Net和大多数其他脚本语言都需要这样做。