Come controllare a livello di codice GAC per un assieme?Controllare GAC per un assieme
risposta
È possibile utilizzare l'API COM Fusion. Junfeng Zhang ha scritto un managed wrapper. È del 2004, quindi, quindi non so più come funziona.
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.
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.
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. –
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");
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
È forse un'idea combinarla con http://msdn.microsoft.com/en-us/library/system. reflection.assembly.globalassemblycache (v = vs.110) .aspx Proprietà GlobalAssemblyCache – ErikEJ
E 'meglio usare ReflectionOnlyLoad
metodo. questo metodo carica un assieme nel contesto di sola riflessione, dove può essere esaminato ma non eseguito.
- 1. Per GAC, o non per GAC?
- 2. Come utilizzare un. Assieme Netto in Delphi senza registrarlo in GAC o COM?
- 3. Esiste un equivalente GAC per .NET Core?
- 4. Costruttore statico per l'intero assieme
- 5. movq funzionalità di un assieme
- 6. Come ricaricare un assieme per un dominio di applicazione .NET?
- 7. enumerazione di assembly in GAC
- 8. Import-Module da GAC per PowerShell Utilizzo
- 9. Installazione di un assembly in GAC sia per mono/.NET
- 10. . NET 4.0 ha un nuovo GAC, perché?
- 11. Problema GAC per l'applicazione host su IIS
- 12. Esiste uno strumento per la gestione GAC?
- 13. Rivisitazione di installazioni GAC
- 14. Aggiornamento dll di GAC
- 15. GAC vs JIT
- 16. Impossibile disinstallare un assembly da GAC?
- 17. Come estrarre un assembly dal GAC?
- 18. Ripping XAML da un. Assieme N.
- 19. Perché un compilatore genera questo assieme?
- 20. Perché contrassegnare un assieme ComVisible (true) scoraggiato?
- 21. Cosa succede quando carico un assieme?
- 22. Se un assembly è nel GAC, anche tutti gli assembly che chiama devono essere nel GAC?
- 23. Determinare il contesto carico di un assieme
- 24. Come specificare la posizione esatta di un assieme in un file di configurazione
- 25. GObject.Mainloop() thread assieme principale
- 26. C# assemblati, che cosa è un assieme?
- 27. Assieme al codice C
- 28. Determinare le versioni di assieme utilizzate da/referenziate in un altro assieme
- 29. Includi gruppi GAC nel raccoglitore
- 30. Come si crea un assieme di test unitario per una libreria di classi portatile .NET?
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. –
@ 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
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. –