.Net hace llamar COM que a su vez llama a otras obras de objetos COM de .NET al utilizar SxS y se utilizan archivos de manifiesto

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

Pregunta

Tengo una aplicación .NET llamar a un componente COM (C ++), que a su vez llama a otro objeto COM implementado en .NET.

Esta aplicación utiliza las capacidades de Windows SxS y no registra cualquiera de sus componentes COM. No es la escrita en C ++, y no el escrito en .NET.

Esta primera llamada al C ++ componente COM funciona bien. Pero cuando las llamadas C ++ COM componente para el .NET, falla con clase no registrada.

He intentado crear una aplicación pequeña C ++ con un archivo de manifiesto que llama al componente .NET y funciona. Parece que cuando el flujo es .net -> COM NATIVO -> COM de .NET. Entonces se rompe SxS y no funciona.

Cuando se observa la fusión de registros (conjunto de carga de troncos) Veo que nadie siquiera se intenta resolver el .NET COM montaje.

Es este escenario SxS incluso supone que el trabajo (creo que no supone que el trabajo)? Si es así, ¿qué puedo estar haciendo mal?

Estos son los archivos de manifiesto que estoy usando.

El manifiesto de la aplicación para la aplicación .NET (Embebido como de recursos):

<?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 (archivo regular):

<?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 manifiesto (Embebido como recurso en PerformanceMonitor.dll Para evitar .net com error en 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>
¿Fue útil?

Solución

No funciona, pero hay cosas que pueden romper él (como he descubierto).

Al parecer, si la aplicación es una aplicación de Windows Forms, y utiliza comando Application.EnableVisualStyles utilizar estilos visuales proporcionados por el sistema operativo, y al mismo tiempo utiliza archivos de manifiesto para crear un contexto de activación, entonces usted está en un aprieto .

Parece (según este ) este comando en sí mismo crea un contexto de activación para el proceso de redirección para utilizar Microsoft.Windows.Common-Controls versión 6.0.0.0. Y por alguna razón este uso se rompe de .NET de objetos COM que se defina en que el archivo de manifiesto.

Extracción Application.EnableVisualStyles de aplicación, y su sustitución por esta dependencia en el archivo de manifiesto parece hacer el truco:

<dependency>
   <dependentAssembly>
     <assemblyIdentity
       type="win32"
       name="Microsoft.Windows.Common-Controls"
       version="6.0.0.0"
       processorArchitecture="X86"
       publicKeyToken="6595b64144ccf1df"
       language="*"
     />
   </dependentAssembly>
</dependency>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top