Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将免注册COM清单嵌入到具有本机/托管环境的C#dll中_C#_.net_Com Interop_Regfreecom_Activation Context Api - Fatal编程技术网

将免注册COM清单嵌入到具有本机/托管环境的C#dll中

将免注册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#类库的选项,因此

我目前正在开发一个混合的本机/托管应用程序链,它使用免注册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查询时公开了以下清单:

<?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和大多数其他脚本语言都需要这样做。