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
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)
En .NET 4 también se puede comprobar la propiedad Assembly.IsDynamic.
Finalmente, Microsoft ha proporcionado esto :) Obviamente, este es el camino a seguir a partir de ahora. –
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
- 1. Comprobando si un archivo es un ensamblado .NET
- 2. Cómo saber si un ensamblado .NET se compiló como x86, x64 o cualquier CPU
- 3. ¿Cómo averiguo si un ensamblado .NET contiene código no administrado?
- 4. Objeto dinámico: cómo saber si una propiedad está definida?
- 5. ¿Cómo saber si existe un archivo en C#/.NET?
- 6. ¿Cómo registrar un ensamblado .NET como COM?
- 7. ¿Comparar 2 versiones de un ensamblado .NET?
- 8. ¿Cómo saber si un objeto es un objeto RegExp?
- 9. ¿Cómo saber si un manejador de archivo es un socket?
- 10. ¿Cómo saber si un archivo es un enlace?
- 11. ¿Es posible ejecutar un ensamblado .NET (dll) desde vbscript?
- 12. ¿Es posible desactivar la reflexión desde un ensamblado .NET?
- 13. ¿Cómo saber si una cadena es xml?
- 14. Cargando archivos DLL de complemento, "El miembro invocado no es compatible con un ensamblado dinámico".
- 15. ¿Cómo saber si la fecha es hoy?
- 16. ¿Cómo puedo saber si una aplicación win32 usa .NET runtime
- 17. Cómo saber si un PropertyInfo es una colección
- 18. ¿Cómo puedo saber si un IQueryable es IQueryableQueryable?
- 19. Java BufferedImage cómo saber si un píxel es transparente
- 20. ¿Cómo puedo saber si un entero Java es nulo?
- 21. ¿Cómo saber si un contexto OpenGL es hardware acelerado?
- 22. ¿Cómo saber si un modelo es nuevo o no?
- 23. ¿Cómo puedo saber si un MotionEvent es relativo o absoluto?
- 24. ¿Cómo saber si un hash Perl es multidimensional?
- 25. ¿Cómo saber si un tipo es una clase estática?
- 26. ¿Cómo incrustar un archivo de texto en un ensamblado .NET?
- 27. ¿Cómo puedo saber si .NET 3.5 SP1 está instalado?
- 28. ¿Cómo puedo saber si está instalado .NET 4.02?
- 29. Obteniendo la fecha de un ensamblado .NET
- 30. ¿Cómo puedo saber si dos DLL .NET son iguales?
todo correcto. Un modulebuilder puede ser "no dinámico". Deberías usar 'ModuleBuilder.IsTransient' para comprobar si es 'dinámico'. – leppie