2009-12-19 12 views

Respuesta

2

Puede usar la API COM de Fusion. Junfeng Zhang escribió un managed wrapper. Es de 2004, sin embargo, así que no sé qué tan bien funciona.

+2

El uso de la API de Fusion basada en COM es la verdadera forma correcta, pero intentar un Assembly.Load y atrapar la excepción FileNotFoundException es mucho más fácil. –

+0

@Mike Post: pero también tiene el desafortunado efecto secundario de cargar el ensamblado en el dominio de la aplicación, que no es realmente lo que se desea aquí. La facilidad de uso no siempre supera la corrección (yo diría que raramente lo hace). – casperOne

+1

ReflectionOnlyLoad tiene el mismo efecto secundario de cargar el conjunto en el dominio de la aplicación. Lea la letra pequeña en los documentos. Es solo un trabajo diferente para tener que usar la complicada API COM Fusion no administrada. –

0

¿Desea probar el GAC para un conjunto o simplemente desea saber que el conjunto existe en la máquina?

Si no te importa que el ensamblaje esté realmente en el GAC, pero solo se puede cargar en la máquina (desde el dominio de aplicación) puedes usar LoadAssembly con el nombre de los ensamblajes (fuerte, común, completo, etc.). Si el conjunto puede ser cargado por Fusion, lo será y entonces sabrá que existe.

15

Sin siquiera tratar de complicarse, puede pagar hasta gacutil y capturar la salida. Por ejemplo, me da gacutil /l Microsoft.Practices.Unity:

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 

frente 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 

Esto es fácil de implementar y analizar y no depende de ninguna implementación de terceros.

+2

Descascarando 'gacutil.exe' y capturando la salida es mi definición de demasiado complicada, me gusta mantener las cosas lo más simples posible :) Si se trata de usar gacutil y la API de Fusion, entonces podría ser discutible. Vea mi respuesta aquí: http://stackoverflow.com/a/19459379/1004119. –

6

De .NET, la API de reflexión - Assembly.Load(...) lanzará un FileNotFoundException si no encuentra el ensamblaje. La API requiere un nombre de ensamblaje totalmente calificado, por lo que asumo que debe estar en el GAC. Lo estoy usando para detectar la presencia de SQL Server Compact Edition:

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

Assembly.Load también busca en otras ubicaciones: el contexto de carga predeterminado contiene ensamblajes encontrados probando el caché de ensamblados global, el ensamblado de host almacenado si el tiempo de ejecución está alojado (por ejemplo, en SQL Server) y ApplicationBase y PrivateBinPath de la aplicación dominio. - http://msdn.microsoft.com/cs-cz/library/dd153782.aspx – Bohdan

+1

Quizás sea una idea combinar esto con el http://msdn.microsoft.com/en-us/library/system. reflection.assembly.globalassemblycache (v = vs.110) .aspx Propiedad GlobalAssemblyCache – ErikEJ

7

Es mejor utilizar ReflectionOnlyLoad Método. este método carga un ensamblaje en el contexto de solo reflexión, donde puede examinarse pero no ejecutarse.

Cuestiones relacionadas