2009-07-06 8 views
11

Esta es una extensión de una pregunta que le pregunté anteriormente here.Mostrando un formulario desde una DLL cargada dinámicamente

larga historia, que carga de forma dinámica una DLL y hacer un type fuera de él con el siguiente código:

Assembly assembly = Assembly.LoadFile("C:\\test.dll"); 
Type type = assembly.GetType("test.dllTest"); 
Activator.CreateInstance(type); 

Desde allí puedo utilizar para hacer referencia type prácticamente nada en la clase dllTest. La clase por defecto cuando se ejecuta debe mostrar un formulario (en este caso, bastante vacío, por lo que no es complejo).

Siento que me falta una línea clave de código aquí que impide que el formulario se cargue en la pantalla.

dllTest.cs (dentro de la DLL) se compone de:

namespace test 
{ 
    public partial class dllTest : Form 
    { 
     public dllTest() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

InitializeComponent() conjuntos hasta el diseño de la forma, que es demasiado tiempo para pegar aquí y no debe hacer una diferencia.

¿Alguna idea?

+0

Esta no es una respuesta directa a su pregunta, pero si va a hacer mucho de esto, es posible que desee comprobar el bloque de aplicación compuesta (CAB). Es parte de Smart Client Software Factory y se puede encontrar aquí: http://msdn.microsoft.com/en-us/library/aa480482.aspx – blu

Respuesta

14

que tiene que hacer algo con la forma que acaba de crear:

Assembly assembly = Assembly.LoadFile("C:\\test.dll"); 
Type type = assembly.GetType("test.dllTest"); 
Form form = (Form)Activator.CreateInstance(type); 
form.ShowDialog(); // Or Application.Run(form) 
+1

lol ¡Creo que la solución es evidente! –

+1

Gracias, funcionó a la perfección. – scrot

3

Sí, que no son en realidad especificar ningún código para ejecutar fuera del inicializador de la clase. Por ejemplo, con formularios tienes que mostrarlos realmente.

Se podría modificar el código para la siguiente ...

Assembly assembly = Assembly.LoadFile("C:\\test.dll"); 
Type type = assembly.GetType("test.dllTest"); 
Form form = Activator.CreateInstance(type) as Form; 
form.ShowDialog(); 
+1

Si pudiera marcar dos respuestas correctas, lo haría. Gracias. – scrot

+0

Ningún problema en absoluto. –

0

me iría con:

Assembly assembly = Assembly.LoadFile("C:\\test.dll"); 
Type type = assembly.GetType("test.dllTest"); 
object obj = Activator.CreateInstance(type); 
Form form = obj as Form; 
if (form != null) 
    form.Show(); //or ShowDilaog() whichever is needed 

Otro comprobación de errores/manejo debe añadirse; sin embargo, al menos me aseguraré de que la conversión funcione.

+0

Si solo quiere hacer la comprobación nula, la referencia de objeto adicional no es necesaria, podría deshacerse de obj y hacer el fundido directamente en la instancia de creación. –

+0

Según cuál sea su plan en caso de falla, puede hacerlo y eliminar una línea de código. Pero si la verificación falla, planea hacer/probar algo más con el objeto, entonces debe hacerse en líneas separadas. –

+0

Estoy de acuerdo, pero en el segundo caso creo que delegaría a un enfoque más pragmático en lugar de un molde de forma optimista y luego un interruptor a prueba de fallas en línea. –

1

Si una clase pertenece a Form, entonces Assembly.GetType() devuelve NULL. Si una clase pertenece a User Control entonces puedo ver que se devuelve el tipo.

también la sintaxis debe ser tan:

Type type = assembly.GetType("Assemblytest.clsTest"); 

donde

  • clsTest será el nombre de la clase (de un control de usuario)
  • Assemblytest es el nombre de montaje sin el. dll extensión.
Cuestiones relacionadas