Domanda

Ho un codice per caricare un file EXE e mostra il suo codice CIL per utente.Per farlo uso mono.cecil e mono.cecil.cil.

Ora voglio fare qualcosa di diverso: voglio sapere se l'utente ha mono.cecil e mono.cecil.cil nel suo sistema.Per fare ciò ho pensato di usare la riflessione.assembly.load con mono.cecil e mono.cecil.cil.Qualcosa come:

public void PrintInstr( ) {
    try
    {
        Reflect.Assembly mc = Reflect.Assembly.Load( "Mono.Cecil" );
        Reflect.Assembly mcc = Reflect.Assembly.Load( "Mono.Cecil.Cil" );
    }
    catch( Exception )
    {
        System.Console.WriteLine( "\"Mono.Cecil\" or \"Mono.Cecil.Cil\" not found " );
        return;
    }
    //[...]
}
.

Ma ottengo solo il seguente errore:

Could not load file or assembly 'Mono.Cecil' or one of its dependencies.
The system cannot find the file specified.
.

E, naturalmente, ho mono.cecil e mono.cecil.cil.Non sto usando correttamente assembly.load?Se è il caso, qualcuno può dirmi come usare il gruppo. Road per poter caricare mono.cecil e mono.cecil.cil senza cercare un percorso (per effettuare un solo file EXE da utilizzare in Windows o GNU / Linuxcon mono)?

Nota : Sto lavorando sotto la menta Linux con MonoDevelop 2.6 o con Windows 7 con MonoDevelop 2.8.

È stato utile?

Soluzione

Sembri essere fraintendere ciò che assembly.load < / a> fa per caricare il gruppo. Immagino che cosa stai cercando di cercare sia se l'utente ha mono.cecil nel GAC. Il problema è che solo i percorsi di ricerca dell'attuale AppDomain vengono cercati quando si fornisce un nome parziale, il GAC viene utilizzato solo quando si fornisce il nome completo. Questo è documentato qui :

.

Fornire un nome di assemblaggio parziale per AssembleyRef non è raccomandato. (Un nome parziale omette una o più di cultura, versione o chiave pubblica gettone. Per i sovraccarichi che prendono una stringa invece di un assemblyname Oggetto, "Myasembly, versione= 1.0.0.0" è un esempio di nome parziale e "myasembly, versione= 1.0.0.0, cultura= neutrale, Pubblica PublicKeyToken= 18Ab3442Da84B47 "è un esempio di un nome completo.) Usando I nomi parziali hanno un effetto negativo sulle prestazioni. Inoltre, a Il nome del gruppo parziale può caricare un assembly dall'assemblea globale cache solo se c'è una copia esatta del gruppo nel Directory di base dell'applicazione (basedirectory o AppDomainsEtup.ApplicationBase).

Ulteriori informazioni su come le sonde CLR per Assembly possono essere trovate qui: http://msdn.microsoft.com/en-us/library/aa720133.aspx

Questo è esattamente il motivo per cui assembly.loadwithpartialname () esiste, ma È stato deprecato.

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