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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top