mixed-mode dependencies c++ c# .net

mixed mode - Biblioteca de modo mixto y dependencias CRT-AYUDA



mixed-mode dependencies (5)

¿Desplegó las bibliotecas CRT en la máquina de destino? Posesión general: ya que tiene una dependencia en el código de 32 bits, debe establecer Target Platform en la pestaña de propiedad Build en x86.

EDITAR: solución de problemas lado a lado para resolver problemas con la utilidad Sxstrace.exe , disponible en Vista.

De acuerdo, después de investigar un montón y probar casi todos los CPP Redist que puedo encontrar e intentar copiar mis archivos DLL localmente en el directorio de ejecución de la aplicación, no puedo averiguar qué dependencias me faltan para esta biblioteca de modo mixto.

Básicamente tengo una gran aplicación de C # y estoy tratando de usar una biblioteca de modo mixto que hice. En la máquina de desarrollo, funciona perfecto (por supuesto) pero se implementa cuando la biblioteca necesita cargarse para usar excepciones debido a la falta de dependencias CRT (supongo).

Utilicé el walker de dependencias para comprobar todas las DLL a las que se hace referencia y me aseguré de que existían en la máquina de despliegue sin suerte, me pregunto si tal vez se deben registrar algunas dependencias que me faltan, pero no puedo entender qué .

Obtengo la siguiente excepción cuando el código intenta crear una instancia de una clase de la biblioteca de modo mixto.

Detalle de la excepción: System.IO.FileLoadException: No se pudo cargar el archivo o ensamblado ''USADSI.MAPI, Version = 1.0.3174.25238, Culture = neutral, PublicKeyToken = null'' o una de sus dependencias. Esta aplicación no ha podido iniciarse porque la configuración de la aplicación es incorrecta. Reinstalar la aplicación podría resolver el problema. (Excepción de HRESULT: 0x800736B1)

Estoy compilando la biblioteca usando VS2008 SP1 con / clr: oldSyntax especificado.

El manifiesto intermedio se ve así:

<assembly xmlns=''urn:schemas-microsoft-com:asm.v1'' manifestVersion=''1.0''> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level=''asInvoker'' uiAccess=''false'' /> </requestedPrivileges> </security> </trustInfo> <dependency> <dependentAssembly> <assemblyIdentity type=''win32'' name=''Microsoft.VC90.CRT'' version=''9.0.21022.8'' processorArchitecture=''x86'' publicKeyToken=''1fc8b3b9a1e18e3b'' /> </dependentAssembly> </dependency> </assembly>

Puedo proporcionar más información según sea necesario, desafortunadamente no estoy muy familiarizado con la creación de bibliotecas de modo mixto, así que esto me ha desanimado.

¡Si alguien puede ofrecer algún consejo, lo agradecería mucho!


Encontré una solución que parece funcionar, aunque no me gusta mucho.

Tuve que copiar las carpetas:

Microsoft.VC90.CRT y Microsoft.VC90.MFC

De: Archivos de programa / Microsoft Visual Studio 9.0 / VC / redist / x86

En el directorio de aplicaciones desplegado, simplemente no puedo entender por qué esto parece funcionar y los redistribuibles no hicieron nada.

EDITAR: Viendo el manifiesto probablemente no necesite copiar el directorio de MFC


Tuve un problema similar la primera vez que implementé una aplicación VS 2005 en una máquina objetivo: tuve que traer la DLL MSVCRT80. ¿Estás diciendo que ya tienes allí la biblioteca de tiempo de ejecución de VS de 2008?

ETA: También, pregunta tonta, pero ¿estás seguro de que tienes tanto CRT Runtime (vinculado al anterior) como .NET Runtime, con la misma versión compilada (probablemente 3.5)? Probablemente ya sepa esto (especialmente teniendo en cuenta su puntaje) pero son 2 cosas diferentes.


La mejor forma de resolver este problema es descargar el monitor de procesos que está libre de: http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

Agregue un filtro para ver solo su proceso y le mostrará todo el acceso a archivos que el proceso intenta. Esto le mostrará exactamente qué dll no puede encontrar.

Siempre uso esto cuando me enfrento con el mismo problema - si solo microsoft llenase el nombre del archivo en la excepción lanzada, todo sería más fácil.


Por lo general, he descubierto que el estilo de comentario de pragma manifiesta que la declinación es mucho más libre de errores, desde el mantenimiento de un desarrollador hasta la perspectiva de la acción de compilación. Los manifiestos XML son natuously snafu .

La importancia de cómo funciona el enlazador y la compilación habitual del código C y el hecho de que simplemente lo incluyas en uno de tus archivos de origen hace que todo se sienta un poco más "unido";

#pragma comment(linker, / "/"/manifestdependency:type=''Win32'' "/ "name=''Microsoft.Windows.Common-Controls'' "/ "version=''6.0.0.0'' "/ "processorArchitecture=''*'' "/ "publicKeyToken=''6595b64144ccf1df'' "/ "language=''*''/"")