Pregunta

Muy bien, después de hacer un montón de investigación y probar casi todos los CPP Redist gestionados que puedo encontrar, así como tratar de copiar mis DLL localmente en el directorio de ejecución de la aplicación, no puedo entender qué dependencias me faltan para esta mezcla biblioteca de modo.

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 a la perfección (por supuesto), pero se implementa cuando la biblioteca necesita ser cargada para usarla, excepto porque faltan dependencias de CRT (supongo).

He utilizado el caminante de dependencias para verificar todas las DLL a las que se hace referencia y me aseguré de que existan en la máquina de despliegue sin suerte, me pregunto si tal vez sea necesario registrar algunas dependencias que me faltan, pero no puedo averiguar 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 archivo o ensamblado 'USADSI.MAPI,   Versión = 1.0.3174.25238,   Cultura = neutral, PublicKeyToken = nulo '   o una de sus dependencias. Esta   la aplicación no se ha podido iniciar   porque la configuración de la aplicación   Es incorrecto. Reinstalando el   La aplicación puede solucionar este 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 bien versado en la creación de bibliotecas de modo mixto, por lo que esto me ha echado fuera.

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

¿Fue útil?

Solución

¿Desplegó el CRT bibliotecas en la máquina de destino? Plano general: ya que tiene una dependencia con el código de 32 bits, debe establecer la Plataforma de destino en la pestaña de propiedades de compilación en x86.

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

Otros consejos

Normalmente, he encontrado que el pragma comment naturalmente snafu .

La similitud con la forma en que funciona el enlazador y la compilación habitual de código C y el hecho de que simplemente lo incorporas a uno de tus archivos fuente, hace que todo se sienta un poco más "juntos".

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

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

ETA: también, pregunta tonta, pero ¿está seguro de tener tanto el Tiempo de ejecución de CRT (vinculado a los anteriores) como y el Tiempo de ejecución de .NET, con la misma versión que compiló (probablemente 3.5)? Probablemente ya lo sepas (especialmente teniendo en cuenta tu puntaje) pero son 2 cosas diferentes.

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

Tuve que copiar las carpetas:

Microsoft.VC90.CRT & amp; Microsoft.VC90.MFC

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

En el directorio de la aplicación desplegada, simplemente no puedo entender por qué esto parece funcionar y los redistribuibles no hicieron nada.

EDIT: mirando el manifiesto, probablemente no necesito copiar el directorio MFC

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

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

Siempre uso esto cuando me enfrento al mismo problema: si solo Microsoft rellenara el nombre del archivo en la excepción lanzada, todo sería más fácil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top