2009-09-14 23 views
42

Al iterar a través de un conjunto de conjuntos, p. AppDomain.CurrentDomain.GetAssemblies(), los ensamblados dinámicos lanzarán una excepción NotSuportedException si intenta acceder a propiedades como CodeBase. ¿Cómo se puede decir que un ensamblaje es dinámico sin activar y atrapar la excepción NotSupportedException?¿Cómo saber si un ensamblado .NET es dinámico?

Respuesta

41

Para comprobar si el conjunto es dinámico:

if (assembly.ManifestModule is System.Reflection.Emit.ModuleBuilder) 

Esto me tomó un tiempo para averiguar, por lo que aquí se preguntó y respondió.

Actualización:

En .NET 4.0, ahora hay una propiedad:

if (assembly.IsDynamic) 
+5

todo correcto. Un modulebuilder puede ser "no dinámico". Deberías usar 'ModuleBuilder.IsTransient' para comprobar si es 'dinámico'. – leppie

18

En .NET 4 también se puede comprobar la propiedad Assembly.IsDynamic.

+0

Finalmente, Microsoft ha proporcionado esto :) Obviamente, este es el camino a seguir a partir de ahora. –

0

Antes de .NET Framework 4, la solución más simple parece ser comprobar si el conjunto es de tipo System.Reflection.Emit.AssemblyBuilder. Esta es la solución que usamos en nuestro equipo.

Si echa un vistazo a la implementación de la propiedad CodeBase de AssemblyBuilder, simplemente lanza una excepción, independientemente de cualquier otra cosa. AssemblyBuilder también es una clase sellada, por lo que es imposible que una clase derivada modifique este comportamiento. Entonces, si tiene un objeto AssemblyBuilder, puede estar seguro de que nunca puede llamar a CodeBase o GetManifestResourceStream u otros métodos.

public override string CodeBase 
{ 
    get 
    { 
     throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicAssembly")); 
    } 
} 

Y en .NET Framework 4, comprobando la propiedad Assembly.IsDynamic debería ser preferible porque es más legible y tal vez más a prueba de futuro, en caso de que alguna nueva clase viene que anula IsDynamic. Dado que AssemblyBuilder.IsDynamic siempre devuelve verdadero, esto es más evidencia de que un objeto AssemblyBuilder siempre es equivalente a un "dll dinámico".

Aquí está el .NET 4 IsDynamic de AssemblyBuilder:

public override bool IsDynamic 
{ 
    get { 
     return true; 
    } 
} 
No
Cuestiones relacionadas