2010-04-07 148 views
4

我有一個.NET應用程序調用COM組件(C++),該組件調用另一個COM對象。淨。.net調用COM,然後調用其他.net COM對象在使用SxS和清單文件時工作

此應用程序正在使用Windows SxS功能,並未註冊任何COM組件。不是用C++編寫的,也不是用.net編寫的。

對C++ COM組件的第一次調用工作正常。但是,當C++ COM組件調用.net的時候,它會因類未註冊而失敗。

我已經嘗試創建一個小的C++應用程序與清單文件,它調用.net組件,它的工作原理。 似乎當流量是.net - > COM NATIVE - > .NET COM。然後SxS中斷並且不起作用。

查看Fusion日誌(程序集加載日誌)時,我發現沒有人甚至試圖解析.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解決.net COM在XP中的bug):

<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> 

回答

6

它確實有效,但t這裏有些東西可以打破它(就像我發現的那樣)。顯然,如果您的應用程序是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>