2009-12-19 19 views

risposta

2

È possibile utilizzare l'API COM Fusion. Junfeng Zhang ha scritto un managed wrapper. È del 2004, quindi, quindi non so più come funziona.

+2

L'utilizzo dell'API Fusion basata su COM è il vero modo corretto, ma il tentativo di un assembly. Il caricamento e l'acquisizione di FileNotFoundException è molto più semplice. –

+0

@ Mike Post: Ma ha anche lo sfortunato effetto collaterale del caricamento dell'assieme nel dominio dell'app, che in realtà non è ciò che si desidera qui. La facilità d'uso non esclude sempre la correttezza (direi che raramente lo fa). – casperOne

+1

ReflectionOnlyLoad ha lo stesso effetto collaterale del caricamento dell'assieme nel dominio dell'app. Leggi la stampa fine nei documenti. È solo un altro modo per aggirare il fatto di dover utilizzare la complicata API COM Fusion non gestita. –

0

Si desidera analizzare il GAC per un assieme o si desidera solo sapere che l'assieme esiste sulla macchina?

Se non si cura che l'assembly sia effettivamente nel GAC, ma solo caricabile sulla macchina (dall'appadominio), è possibile utilizzare LoadAssembly con il nome degli assembly (forte, comune, completo, ecc.). Se l'assembly può essere caricato da Fusion, lo sarà e quindi saprai che esiste.

15

Senza nemmeno tentare di complicarsi, è possibile effettuare il roaming a gacutil e acquisire l'output. Ad esempio, gacutil /l Microsoft.Practices.Unity mi dà:

Microsoft (R) .NET Global Assembly Cache Utility. Version 3.5.30729.1 
Copyright (c) Microsoft Corporation. All rights reserved. 

The Global Assembly Cache contains the following assemblies: 
    Microsoft.Practices.Unity, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31 
bf3856ad364e35, processorArchitecture=MSIL 

Number of items = 1 

contro gacutil /l Some.Nonexistant.Assembly:

Microsoft (R) .NET Global Assembly Cache Utility. Version 3.5.30729.1 
Copyright (c) Microsoft Corporation. All rights reserved. 

The Global Assembly Cache contains the following assemblies: 

Number of items = 0 

Questo è facile da implementare e analizzare e non dipende da eventuali implementazioni di terze parti.

+2

Eliminare 'gacutil.exe' e catturare l'output è la mia definizione di eccessivamente complicato, mi piace mantenere le cose il più semplice possibile :) Se è tra l'utilizzo di gacutil e l'API di Fusion, allora potrebbe essere discutibile. Vedi la mia risposta qui: http://stackoverflow.com/a/19459379/1004119. –

6

Da .NET, la reflection API - Assembly.Load(...) genererà un FileNotFoundException se non trova il gruppo. L'API richiede un nome assembly completo, quindi presumo che sia nel GAC. Io lo utilizzo per verificare la presenza di SQL Server Compact Edition:

Assembly foo = Assembly.Load("System.Data.SqlServerCe, Version=3.5.1.0, " + 
    "Culture=neutral, PublicKeyToken=89845dcd8080cc91"); 
+1

Assembly.Load ricerca anche altre posizioni: il contesto di caricamento predefinito contiene gli assembly rilevati rilevando la cache di assembly globale, l'assembly di assembly host se il runtime è ospitato (ad esempio, in SQL Server) e ApplicationBase e PrivateBinPath dell'applicazione dominio. - http://msdn.microsoft.com/cs-cz/library/dd153782.aspx – Bohdan

+1

È forse un'idea combinarla con http://msdn.microsoft.com/en-us/library/system. reflection.assembly.globalassemblycache (v = vs.110) .aspx Proprietà GlobalAssemblyCache – ErikEJ

7

E 'meglio usare ReflectionOnlyLoad metodo. questo metodo carica un assieme nel contesto di sola riflessione, dove può essere esaminato ma non eseguito.

Problemi correlati