2011-02-26 10 views
5

No estoy seguro de la mejor manera de explicar esto, por favor deje comentarios si no entiende.¿La mejor manera de realizar solo una función si se carga una DLL (.NET)?

Básicamente, tengo algunas bibliotecas para que varias tareas funcionen con diferentes programas; la notificación es solo un ejemplo.

Ahora, estoy construyendo un nuevo programa, y ​​quiero que sea lo más ligero posible. Aunque me gustaría incluir mi motor de notificación, no creo que muchas personas utilicen realmente su funcionalidad, por lo que preferiría no incluirlo de manera predeterminada, solo como una descarga opcional.

¿Cómo programo esto?

Con Dlls no administrados y P/Invoke, básicamente puedo ajustar todo el lote en un ciclo de prueba/captura, pero no estoy seguro acerca de la versión administrada.

Hasta ahora, la mejor manera en que puedo pensar es comprobar si el archivo DLL existe al inicio, luego configurar un campo bool o similar, y cada vez que quisiera que se dispare una notificación, podría hacer un if/compruebe el bool y encienda ...

He visto en la ventana de depuración que los archivos DLL solo se cargan cuando son necesarios. El programa obviamente se compilará, ya que todos los componentes serán visibles para el proyecto, pero ¿se ejecutará en la máquina de los usuarios finales sin el DLL?

Más importante aún, ¿hay una mejor manera de hacerlo?

Lo ideal sería que no quisiera tener nada sobre las notificaciones en mi aplicación y de alguna manera tenerlo de modo que si el archivo DLL se descarga, agrega esta funcionalidad externamente. Realmente no es el fin del mundo tener unos pocos bytes adicionales llamando al notification("blabla"); (o similar), pero estoy pensando mucho más adelante cuando tengo intenciones mucho más grandes y solo quiero conocer las mejores prácticas para este tipo de cosas. .

Respuesta

2

Puede usar System.Reflection.Assembly y su método LoadFile para cargar dinámicamente una DLL. A continuación, puede usar los métodos en ensamblado para obtener clases, tipos, etc. incrustados en el archivo DLL y llamarlos.

Si solo comprueba si existe .dll o carga cada .dll en un directorio de complementos, puede obtener lo que desea.

+0

distinción sutil, pero también puede probar si la carga tiene éxito, sin saber la ruta. La configuración de encuadernación ensamblada se puede usar para controlar, p. la ubicación de un directorio de complementos sin que el programa necesite saber cómo funciona la resolución de nombres. En otras palabras, el código debe ser independiente del archivo de ensamblaje físico real. – harpo

+0

Voy a echar un vistazo al System.Reflection.Assembly - Gracias ... ... he modificado el espacio en blanco en su respuesta, ya que dice que ya he votado y no voy a dejar que vote ... Creo que relacionado con el corte antes. – Wil

1

A su pregunta si el programa se ejecutará en la máquina del usuario sin que los dlls ya estén presentes, sí, se ejecutará el programa. Siempre que no haga algo que necesite el tiempo de ejecución para cargar las clases definidas en el dll, no importa si falta el dll de la máquina. Para el aspecto que busca con respecto a cargar el dll bajo demanda, creo que está bien de usar algún tipo de configuración y Reflexión (ya sea directamente o mediante alguna estrategia IoC)

0

Intente cargar el complemento al inicio.

En lugar de verificar un booleano en todas partes, puede crear un campo delegado para la notificación e inicializarlo en una función no operativa. Si la carga del complemento se realiza correctamente, asigne el delegado a la implementación del complemento. Luego, en cualquier lugar donde ocurra el evento, puede llamar al delegado, sin preocuparse por el hecho de que el complemento esté o no disponible.

4

No creo que a mucha gente le hecho uso de su funcionalidad, así, preferiría no incluirlo por defecto - al igual que una descarga opcional.

Tales cosas se describen típicamente como complementos (o complementos, o extensiones).

Desde .NET 4, la forma estándar de hacerlo es con el Managed Exensibility Framework. Se incluye en el marco como el ensamblado System.ComponentModel.Composition y el espacio de nombres. Para comenzar, es mejor leer el MSDN article y el MEF programming guide.

+0

Recientemente (los últimos dos meses) tuve un desarrollo serio de C#. Hubo charlas sobre MEF en un grupo de usuarios del que soy miembro ... Desearía haber tenido una programación seria en aquel entonces, ya que pasó completamente por alto cabeza - No tenía idea de que esto era de lo que se trataba ... Después de escribir la pregunta, de repente pensé en cómo escribir una extensión de tipo de intermediario que funcionara como yo quisiera ... Sin embargo, ciertamente tomaré un vistazo a MEF para ver si hace lo que necesito primero (si no es complicado ... ¡todavía soy bastante nuevo!) – Wil

Cuestiones relacionadas