Вызывает ли .NET COM, который в свою очередь вызывает другие .NET COM объекта работает при использовании SXS и файлов манифеста.

StackOverflow https://stackoverflow.com/questions/2591871

Вопрос

У меня есть приложение .NET, вызывающее COM-компонент (C ++), который в свою очередь вызовов на другой объект COM, реализованный в .NET.

Это приложение использует возможности Windows SXS и не регистрирует ни один из его компонентов COM. Не тот, который написан в C ++, а не один написанный в .NET.

Этот первый вызов COM COM COM отлично работает. Но когда C ++ COM компонент вызывает .NET One, не работает с классом, не зарегистрированным.

Я попытался создать небольшое приложение C ++ с помощью файла манифеста, который вызывает компонент .NET, и он работает. Похоже, что когда поток является .NET -> COM родной -> .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>

Performantitor Mainest (встраивается как ресурс в Performancemonitor.dll для работы вокруг .NET COM BUG в XP):

<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>
Это было полезно?

Решение

Это работает, но есть вещи, которые могут сломать его (как я узнал).

Видимо, если ваше приложение является приложением WinForms, и он использует Application.enableVisualStyles. Команда для использования визуальных стилей, предоставляемых ОС, и в то же время используются файлы Mainest для создания контекста активации, то вы находитесь в сорте.

Кажется (согласно это) Эта команда само по себе создает контекст активации для перенаправления процесса для использования 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top