2009-02-11 11 views
5

Estoy buscando una manera más eficiente de encontrar un tipo en un conjunto que se deriva de un tipo específico conocido. Básicamente, tengo una arquitectura plug-in en mi solicitud, y por el tiempo más largo que he estado haciendo esto:¿Cómo puedo ubicar un tipo específico en una Asamblea * de manera eficiente *?

For Each t As Type In assem.GetTypes() 
    If t.BaseType Is pluginType Then 
     'Do Stuff here' 
    End If 
Next 

Algunos de los plugins tienen un gran número de tipos y estamos empezando a ver esto toma una pocos segundos. ¿Hay alguna manera en que pueda simplemente solicitar todos los tipos que tengan un BaseType de "tipo de complemento"?

EDITAR: He sobre simplificado mi código de muestra. Estaba usando .GetExportedTypes() en mi código actual. Sin embargo, muchas clases se marcaron como públicas, por lo que no ayudaba demasiado. Revisé los proyectos y marqué todo como "Amigo", excepto por la clase de complemento real, y aún lleva casi el mismo tiempo examinar los conjuntos. Corté tal vez 100 ms fuera de 1.3 segundos (que es menos del 10%). ¿Es este el tiempo mínimo que tengo para tratar? También probé la sugerencia de Atributo de la Asamblea y todavía no produjo mucha diferencia (quizás 100 ms de nuevo). ¿Es el resto del tiempo la sobrecarga que tengo que pagar para cargar ensambles dinámicamente?

+0

No es realmente una respuesta a la pregunta, pero tal vez eche un vistazo a MEF: http: //www.codeplex.com/MEF – herskinduk

+0

¿Cuán más compleja es su condición de prueba real? ¿Estás usando 'AndAlso' y' OrElse' o simplemente 'And' y' Or'? Lo pregunto porque en mi máquina más lenta, usando el intérprete DotLisp, enumerar 14807 tipos toma 0.322 segundos y obtener tipos públicos con 'BaseType = Component' toma 0.458 segundos. Oh, al verificar la versión compilada de LinqPad de esta consulta en esta máquina más lenta, veo el problema: antes de que los objetos 'Type' estén en caché, o incluso construidos detrás de escena, es mucho más lento: 10961' Types' enumerados en 10.206 segundos. Inmediatamente después, son solo 0.03323 segundos para encontrar 'Componentes'. –

Respuesta

1

Assembly.GetExportedTypes() solo devuelve clases públicas. Podría esto ayudar?

+0

Por favor, vea la pregunta actualizada ... –

4

En primer lugar, puede intentar usar GetExportedTypes() para restringir la lista de posibles tipos. Aparte de eso, no hay forma de que puedas acelerar el proceso de iteración. Puede, sin embargo, incluir una mainfest plugin que se especifique el tipo exacto (tipos) de plugins dentro de un conjunto en particular:

<manifest> 
    <plugin type="FooBar.Plugins.BazPlugin, FooBar" /> 
</manifest> 

modo que usted sería capaz de hacer Type.GetType(string)

IPlugin plugin = (IPlugin)Type.GetType("manifest/plugin/@type" /* for the sake of this discussion */); 
+0

Por favor, consulte la pregunta actualizada ... –

0

Nuestro el sistema de complemento utiliza atributos para identificar los tipos de plug-in. Luego escaneamos el ensamble para el atributo específico.

+0

Por favor, consulte la pregunta actualizada ... –

1

Solución de mono-devel mailing list post by Jonathan Pryor y Plug-in Framework (Part1): Marking Types for Consumption: utilice los atributos de nivel de ensamblaje.

En resumen, deberá añadir un nuevo atributo:

[AttributeUsage(AttributeTargets.Assembly, AllowMultiple=true)] 
class PluginAttribute : Attribute { 
    public PluginAttribute (Type type) {this.Type = type;} 
    public Type Type {get; private set;} 
} 

A continuación, especifica este atributo en el nivel de montaje:

[assembly:Plugin (typeof(Plugin1))] 
[assembly:Plugin (typeof(Plugin2))] 

a continuación, consulta el conjunto de todos los PluginAttributes:

Assembly a = ...; 
PluginAttribute[] plugins = 
    (PluginAttribute[]) a.GetCustomAttributes (
     typeof(PluginAttribute), true); 
foreach (var plugin in plugins) 
// plugin.Type is the type to use as a plugin 

Esto puede ser mucho más rápido que usar Assembly.GetTypes()/Assembly.GetExportedTypes(), como solo los tipos que se enumeran en los atributos [assembly:Plugin] realmente necesitan para cargarse, lo que puede disminuir significativamente la cantidad de memoria consumida (según la cantidad de tipos en el conjunto).

0

Dado mi comentario sobre la pregunta, si puedes, enumera todos los tipos en otro hilo mientras haces otras cosas. Luego, cuando esté listo para enumerar los tipos que necesita, debe ser al menos dos órdenes de magnitud más rápido, de acuerdo con my tests.

Cuestiones relacionadas