当使用SxS和清单文件时,.net调用COM会调用其他.net COM对象吗?

Ale*_*der 4 .net com sxs side-by-side regfreecom

我有一个.net应用程序调用COM组件(C++),后者又调用另一个在.NET中实现的COM对象.

此应用程序使用Windows SxS功能,不会注册任何COM组件.不是用C++编写的,也不是用.net编写的.

第一次调用C++ COM组件工作正常.但是当C++ COM组件调用.net组件时,它会因类未注册而失败.

我尝试使用清单文件创建一个小型C++应用程序,该文件调用.net组件并且它可以工作.似乎当流是.net - > COM NATIVE - > .NET COM时.然后SxS中断并且不起作用.

在查看Fusion Logs(程序集加载日志)时,我发现没有人甚至试图解析.NET COM程序集.

这个SxS场景是否应该起作用(我认为它确实有效)?如果是,那么我可以做错什么?

这些是我正在使用的清单文件.

.net应用程序的应用程序清单(作为资源嵌入):

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<file name="DotNetComConsumer.dll" hashalg="SHA1">
  <comClass clsid="{44E69FC9-5EAF-4D57-8C09-430F703AD82F}" tlbid="{4F81C9C3-FDDF-48F6-BC25-6F8CD458EBE6}"/>
  <typelib tlbid="{4F81C9C3-FDDF-48F6-BC25-6F8CD458EBE6}" resourceid="1" version="2.0" helpdir="" flags="HASDISKIMAGE"/>
</file>
<comInterfaceExternalProxyStub name="_Class1" iid="{5D41351A-440B-4175-9296-72D5EED83AA7}" tlbid="{4F81C9C3-FDDF-48F6-BC25-6F8CD458EBE6}"   proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"/>
<dependency>
  <dependentAssembly>
    <assemblyIdentity type="win32" name="application.sxs" version="1.0.0.0" />
  </dependentAssembly>
</dependency>
</asmv1:assembly>
Run Code Online (Sandbox Code Playgroud)

application.sxs.manifest(常规文件):

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="application.sxs" version="1.0.0.0"/>   
<dependency>
<dependentAssembly>
  <assemblyIdentity name="PerformanceMonitor" version="10.0.0.9999" publicKeyToken="792843134cf0407a" processorArchitecture="msil"/>
</dependentAssembly>
</dependency>
</assembly>
Run Code Online (Sandbox Code Playgroud)

PerformanceMonitor清单(作为PerformanceMonitor.dll中的资源嵌入以解决XP中的.net com错误):

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="PerformanceMonitor" version="10.0.0.9999" publicKeyToken="792843134cf0407a" processorArchitecture="msil"></assemblyIdentity>

<clrClass clsid="{AA614438-BC7D-400c-8837-525BFBB7253A}" progid="PerformanceMonitorFactory" threadingModel="Both" name="PerformanceMonitorFactory" runtimeVersion="v2.0.50727"></clrClass>
<file name="PerformanceMonitor.dll" hashalg="SHA1"/>
</assembly>
Run Code Online (Sandbox Code Playgroud)

Ale*_*der 6

它确实有效,但有些事情可以打破它(正如我已经发现的那样).

显然,如果您的应用程序是WinForms应用程序,并且它使用Application.EnableVisualStyles命令来使用操作系统提供的视觉样式,同时使用清单文件来创建激活上下文,那么您就处于泡沫状态.

看起来(根据这个)这个命令本身创建了一个激活上下文来重定向进程以使用Microsoft.Windows.Common-Controls版本6.0.0.0.由于某种原因,这会破坏您在清单文件中定义的.net com对象的使用.

从应用程序中删除Application.EnableVisualStyles,并将其替换为清单文件中的此依赖项似乎可以解决问题:

<dependency>
   <dependentAssembly>
     <assemblyIdentity
       type="win32"
       name="Microsoft.Windows.Common-Controls"
       version="6.0.0.0"
       processorArchitecture="X86"
       publicKeyToken="6595b64144ccf1df"
       language="*"
     />
   </dependentAssembly>
</dependency>
Run Code Online (Sandbox Code Playgroud)