Libreria in modalità mista e dipendenze CRT - AIUTO
-
04-07-2019 - |
Domanda
Bene, dopo aver fatto un sacco di ricerche e aver provato quasi tutti i Redist CPP gestiti che riesco a trovare, oltre a provare a copiare le mie DLL localmente nella directory di esecuzione dell'app non riesco a capire quali dipendenze mi mancano per questo misto libreria di modalità.
Fondamentalmente ho una grande applicazione C # e sto cercando di usare una libreria in modalità mista che ho creato. Sulla macchina di sviluppo funziona perfettamente (ovviamente) ma distribuito quando la libreria deve essere caricata per usarla eccezioni a causa di dipendenze CRT mancanti (presumo).
Ho usato il walker delle dipendenze per controllare tutte le DLL a cui fa riferimento e mi sono assicurato che esistano sul computer di distribuzione senza fortuna, mi chiedo se forse sono alcune dipendenze che devono essere registrate che mi mancano, ma non posso capire cosa.
Ottengo la seguente eccezione quando il codice tenta di creare un'istanza di una classe dalla libreria in modalità mista.
Dettaglio eccezione: System.IO.FileLoadException: impossibile carica file o assembly 'USADSI.MAPI, Version = 1.0.3174.25238, Cultura = neutro, PublicKeyToken = null ' o una delle sue dipendenze. Questo Impossibile avviare l'applicazione perché la configurazione dell'applicazione non è corretto. Reinstallazione di l'applicazione potrebbe risolvere questo problema. (Eccezione da HRESULT: 0x800736B1)
Sto compilando la libreria usando VS2008 SP1 con / clr: oldSyntax specificato.
Il manifest intermedio è simile al seguente:
<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>
Posso fornire ulteriori informazioni se necessario, sfortunatamente non sono esperto nella creazione di librerie in modalità mista, quindi questo mi ha scartato.
Se qualcuno può offrire qualche consiglio, lo apprezzerei molto!
Soluzione
Hai distribuito CRT librerie sulla macchina target? In breve: poiché si ha una dipendenza dal codice a 32 bit, è necessario impostare la piattaforma di destinazione nella scheda Proprietà build su x86.
EDIT: risoluzione dei problemi affiancati alla risoluzione dei problemi con Utilità Sxstrace.exe , disponibile su Vista.
Altri suggerimenti
In genere ho scoperto che il pragma comment è molto più priva di errori, da una manutenzione degli sviluppatori e da una prospettiva di azione globale. I manifest XML sono natoriously snafu .
La fimiluarity su come funziona il linker e la solita compilazione di codice C e il fatto che lo prendi semplicemente, su uno dei tuoi file sorgente, mantiene tutto un po 'più "insieme"
#pragma comment(linker, \
"\"/manifestdependency:type='Win32' "\
"name='Microsoft.Windows.Common-Controls' "\
"version='6.0.0.0' "\
"processorArchitecture='*' "\
"publicKeyToken='6595b64144ccf1df' "\
"language='*'\"")
Ho avuto un problema simile la prima volta che ho distribuito un'app VS 2005 su un computer di destinazione - ho dovuto trasferire la DLL MSVCRT80. Stai dicendo che hai già la libreria di runtime VS 2008 lì?
ETA: Inoltre, stupida domanda, ma sei sicuro di avere sia il CRT Runtime (collegato sopra) che . NET Runtime, con la stessa versione che hai compilato (probabilmente 3.5)? Probabilmente lo sai già (soprattutto considerando il tuo punteggio) ma sono 2 cose diverse.
Ho trovato una soluzione che sembra funzionare anche se non mi piace molto.
Ho dovuto copiare le cartelle:
Microsoft.VC90.CRT & amp; Microsoft.VC90.MFC
Da: Programmi \ Microsoft Visual Studio 9.0 \ VC \ redist \ x86
Nella directory dell'applicazione distribuita, non riesco proprio a capire perché questo sembra funzionare e i ridistribuibili non hanno fatto nulla.
EDIT: guardando il manifest probabilmente non ho bisogno di copiare la directory MFC
Il modo migliore per risolvere questo problema è scaricare il monitor di processo che è libero da: http://technet.microsoft.com/en-us/sysinternals/bb896645. aspx
Aggiungi un filtro per vedere solo il tuo processo e ti mostrerà tutto l'accesso ai file che il processo prova. Questo ti mostrerà esattamente quale DLL non riesce a trovare.
Lo uso sempre di fronte allo stesso problema: se solo Microsoft avesse compilato il nome file nell'eccezione generata sarebbe tutto più semplice.