2009-06-25 16 views
9

Tengo que hacer una aplicación de interfaz gráfica de usuario utilizando el idioma que elija. La aplicación se ejecutará en Windows XP. Será una especie de aplicación de formulario de Windows compleja. Creo que y según la mayoría de las sugerencias, C# será el mejor para usar. La estructura de árbol a la izquierda de la GUI se rellenará después de leer un archivo de configuración que será un archivo binario. (pero inicialmente puedo trabajar con un archivo ASCII simple para probar mi código). La aplicación aceptará algunas entradas del usuario a través de esta GUI y escribirá la copia de seguridad en el mismo archivo de configuración y reflejará los cambios en la estructura del árbol o las etiquetas o cualquier otro campo correspondiente en el formulario.Aplicación basada en el complemento en C#

Habrá 3 pestañas y 3 archivos de configuración correspondientes para cada una de las pestañas. Necesito ayuda para diseñar la aplicación por ahora. Estoy planeando hacer una aplicación de host (aplicación principal) y usar los 3 controles de pestaña como complementos. ¿Es esto viable? Si es así puedes guiarme en esto. Quiero decir, ¿cómo hago 3 complementos en C# y cómo escribo las interfaces para que la aplicación principal sepa qué complemento se debe cargar y cuándo cargarlo? ¿Habrá una carpeta separada "Plugin" debajo de la carpeta de mi proyecto? Espero que entiendas mi punto, aunque esta es muy poca información para empezar.

También hay algunos archivos .cpp que ya existen en el proyecto. Estos archivos junto con algunos archivos .h contienen algunas definiciones y constantes importantes en ellos. Estos deben integrarse con mi aplicación C#. No tengo ni idea de cómo hacerlo, pero estoy seguro de que es posible compilando el código .cpp en .dll y luego exponiendo el .dll compilado a mi aplicación C#. Por favor, avíseme si necesita más información para el diseño de nivel superior.

Gracias, Viren

+0

"Tengo que hacer una aplicación de interfaz gráfica de usuario" Tengo el coraje de decir "No" – ima

+0

¿No te entendí? – zack

Respuesta

12

Para implementar una interfaz de complemento manualmente, necesitará un método como este. He dejado algunos TODOs, en los que te gustaría mejorar el manejo de errores y/o hacer que la implementación sea un poco más específica.

public List<T> LoadPlugin<T>(string directory) 
    { 
     Type interfaceType = typeof(T); 
     List<T> implementations = new List<T>(); 

     //TODO: perform checks to ensure type is valid 

     foreach (var file in System.IO.Directory.GetFiles(directory)) 
     { 
      //TODO: add proper file handling here and limit files to check 
      //try/catch added in place of ensure files are not .dll 
      try 
      { 
       foreach (var type in System.Reflection.Assembly.LoadFile(file).GetTypes()) 
       { 
        if (interfaceType.IsAssignableFrom(type) && interfaceType != type) 
        { 
         //found class that implements interface 
         //TODO: perform additional checks to ensure any 
         //requirements not specified in interface 
         //ex: ensure type is a class, check for default constructor, etc 
         T instance = (T)Activator.CreateInstance(type); 
         implementations.Add(instance); 
        } 
       } 
      } 
      catch { } 
     } 

     return implementations; 
    } 

Ejemplo para llamar:

List<IPlugin> plugins = LoadPlugin<IPlugin>(path); 

En cuanto a la parte C++ de su pregunta.Hay pocas formas diferentes de abordar esto, aunque la elección correcta depende de su situación específica. Puede hacer un .dll compatible con clr en C++, que su proyecto C# podría referenciar y llamar como cualquier otro .dll al que haga referencia. Además, puede usar P/Invoke para llamar a un .dll nativo.

+0

muchas gracias. Esto realmente ayudó .. – zack

+0

Siempre es bueno encontrar un artículo que no estabas buscando y pensando, debería implementarlo características, ¡Gran punto de partida! – RobertPitt

8

Uno de los conceptos más fáciles de plugin que he utilizado fue sin duda el Managed Extensibility Framework que será parte de .NET 4 (que yo sepa). Lamentablemente, aún no está terminado y solo hay una vista previa disponible que puede diferir de la versión final. Una vez dicho esto, utilizamos MEF Preview 3 para un proyecto uni y funcionó sin problemas y ciertamente hizo todo el plugin mucho más fácil.

+0

Definitivamente uso MEF es increíble. –

1

Echa un vistazo a Castle.

+0

gracias ... el castillo parece fantástico ... no lo sabía ... – zack

3

mirada en el espacio de nombres System.AddIn: http://msdn.microsoft.com/en-us/library/system.addin.aspx

lo contrario, puede hacer todo usted mismo. Antes de que este espacio de nombres estuviera disponible, usé una interfaz común "IPlugin" que cada complemento/complemento necesitaba usar. Luego tuve un cargador que inspeccionó todos los * .dll en una carpeta y luego usé la reflexión para verificar la interfaz. Podría crear instancias de clases que implementaran mi interfaz complemento/complemento

Los archivos cpp probablemente necesiten convertir a C#, o podría crear un dll para hacer referencia.

Cuestiones relacionadas