【问题标题】:Does .net calling COM which in turn calls other .net COM object works when using SxS and manifest files are used.net 调用 COM 是否在使用 SxS 和清单文件时调用其他 .net COM 对象工作
【发布时间】:2011-05-03 23:03:44
【问题描述】:

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

此应用程序正在使用 Windows SxS 功能,并且未注册它的任何 COM 组件。不是用 C++ 编写的,也不是用 .net 编写的。

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

我尝试使用调用 .net 组件的清单文件创建一个小型 C++ 应用程序,它可以工作。 似乎当流程是 .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>

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>

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>

【问题讨论】:

    标签: .net com regfreecom sxs side-by-side


    【解决方案1】:

    它确实有效,但有些东西会破坏它(正如我发现的那样)。

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

    似乎(根据this)这个命令本身会创建一个激活上下文来重定向进程以使用 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-20
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多