2011-12-19 7 views
9

He estado buscando por todas partes una posible solución a esto, pero no puedo encontrar una respuesta. Mi problema es que tengo algunas clases que deben ocultarse por completo de Assembly.getTypes, ya que estoy escribiendo un complemento para una aplicación, y está recogiendo tipos que necesito permanecer oculto (esto sucede incluso si están declarados como clases privadas o internas).Los tipos ocultos no se incluyen en Assembly.GetTypes en .net

cualquiera sabe cómo modificar qué assembly.GetTyes devuelve, o un atributo de aficionado que evitará que esos tipos aparezcan en la lista?

+0

No se puede ocultar cosas de la reflexión, no es un mecanismo de seguridad. –

+0

@BenRobinson: No se puede ocultar cosas de la reflexión, porque ES un mecanismo de seguridad. Los metadatos de tipo se utilizan durante los recorridos de pila y las pruebas de permiso. –

+0

Lo siento, como que lo tengo de vuelta al frente, lo que quise decir es que los niveles de protección como protegidos e internos no son mecanismos de seguridad. –

Respuesta

6

Esto es bastante complicado y es muy frágil, pero podría funcionar.

Cree 2 conjuntos, uno para el complemento y el segundo para los otros tipos. El segundo se colocará en otro directorio conocido y se cargará dinámicamente en el primero cuando sea necesario. (Por ejemplo, a través de Assembly.LoadFrom.)

El primer ensamblaje se colocará en el directorio de plug-ins y solo publicará sus tipos. Esto es muy frágil porque es probable que tengas que codificar una ruta al segundo ensamble y corres el riesgo de que el archivo sea eliminado o movido.

EDITAR comentario
@SLaks' quita la fragilidad de esta solución. Si incrusta el segundo ensamblaje como un recurso y lo carga en tiempo de ejecución, la aplicación que llama al Assembly.GetTypes no verá los tipos que desea ocultar.

+3

Puede cargar el segundo conjunto desde un recurso incrustado. – SLaks

+0

Ahh ... no pensé en eso. ¡Buena idea! –

+0

Excelente idea! Afortunadamente, el directorio no es un problema porque la aplicación expone los directorios a los que puedo acceder, pero la idea del recurso es genio. –

2

Esto no es posible.
Lo siento.

El código que llama a Assembly.GetTypes() debe filtrar normalmente para solo public tipos.

0

Bienvenido al código administrado. La información completa del tipo es necesaria para el verificador de tipo de .NET. Solo el código nativo se puede ocultar de los metadatos .NET, y luego se abandona la portabilidad y los permisos soportados por MSIL puro.

Cuestiones relacionadas