Llamar a formulario de otro proyecto.

28/02/2008 - 19:36 por Xuri | Informe spam
Bueno os explico un poco el tema antes de hacer la pregunta.

El proyecto es en c# con windows forms.

Hasta ahora tenia un proyecto donde tenia las clases, formularios, todo
metido alli mismo y para llamar a un formulario lo llamaba de la siguiente
manera:

-
public static void cargarform(string wSTformulario,Form form_padre)
{
if (wSTformulario == "") return;
string wSTproyecto =
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
wSTformulario = wSTproyecto + ".formularios." + wSTformulario;
facturacion.clases.formulario wFO =
(facturacion.clases.formulario)Activator.CreateInstance(Type.GetType(wSTformulario));
wFO.MdiParent = form_padre;
wFO.Show();
wFO.form_codigo.texto.Focus();
}

-
Lo hacia asi porque lo necesitaba asi, y poder llamar a los forms asi:

form_programa.cargarform("formularios." + Abrir_Formulario,
this.FindForm().ParentForm);

Y nada, hasta ahora bien, el problema esta que ahora, he separado el
proyecto de todas las clases, es decir
tengo dos proyectos.

SISTEMA
FACTURACION

En facturacion va todo lo que hace referencia a la aplicacion
Sistema es un conjunto de clases que quiero utilizar en mas proyectos

El problema esta que la clase que carga esto :

form_programa.cargarform("formularios." + Abrir_Formulario,
this.FindForm().ParentForm);

pues claro, ahora da error porque el formulario esta en el proyecto.Como
puedo hacer para que abra el formulario de otro proyecto?

O que solucion me dais?

Un saludo

Preguntas similare

Leer las respuestas

#6 Alberto Poblacion
29/02/2008 - 10:03 | Informe spam
"Xuri" wrote in message
news:
Eso que indicas no es posible, ya tengo añadido como referencia al
proyecto
FACTURACION el proyecto SISTEMA, y claro, me dice que no es posible crear
una
referencia de facturacion dentro de SISTEMA porque crearia una dependencia
circular, o sea, asi no es posible.

Alguna solucion mas?



Bien, primero la solución elegante: Crear un tercer proyecto, sacar a
dicho proyecto las clases o formularios que tengan que ser llamadas desde
los otros dos, y en los dos originales poner una referencia a este tercer
proyecto. De esa forma la estructura sigue siendo jerárquica y evitamos las
dependencias circulares.

Segundo, la solución "poco elegante", solo para emergencias: Usar
Reflexión. Mediante los métodos de la clase Assembly, cargar dinámicamente
en tiempo de ejecución el ensamblado FACTURACION desde SISTEMA, y usar
System.Reflection para instanciar la clase del formulario y luego llamar a
su método Show(). Eso te permitiría mostrar el formulario, pero como ves es
complejo, poco elegante, y difícil de mantener. Si puedes, yo me inclinaría
por la solución de refactorizar el proyecto para evitar las dependencias
circulares.
Respuesta Responder a este mensaje
#7 Xuri
29/02/2008 - 11:26 | Informe spam
Al final lo he solucionado asi. Dentro de la clase que llama a los forms
desde el SISTEMA:

string wSTproyecto =
System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
wSTformulario = wSTproyecto + "." + wSTformulario;
Sistema.clases.formulario wFO =
(Sistema.clases.formulario)System.Reflection.Assembly.GetEntryAssembly().CreateInstance(wSTformulario);

wFO.MdiParent = form_padre;
wFO.Show();
wFO.form_codigo.texto.Focus();

Asi lo que consigo es :
Lo primero cojo el nombre del ejecutable que llama el sistema.
Cojo el assembly entero y cargo el form.

Al final he optado por esta opcion y va perfecto!! muchas gracias

"Alberto Poblacion" wrote:

"Xuri" wrote in message
news:
> Eso que indicas no es posible, ya tengo añadido como referencia al
> proyecto
> FACTURACION el proyecto SISTEMA, y claro, me dice que no es posible crear
> una
> referencia de facturacion dentro de SISTEMA porque crearia una dependencia
> circular, o sea, asi no es posible.
>
> Alguna solucion mas?

Bien, primero la solución elegante: Crear un tercer proyecto, sacar a
dicho proyecto las clases o formularios que tengan que ser llamadas desde
los otros dos, y en los dos originales poner una referencia a este tercer
proyecto. De esa forma la estructura sigue siendo jerárquica y evitamos las
dependencias circulares.

Segundo, la solución "poco elegante", solo para emergencias: Usar
Reflexión. Mediante los métodos de la clase Assembly, cargar dinámicamente
en tiempo de ejecución el ensamblado FACTURACION desde SISTEMA, y usar
System.Reflection para instanciar la clase del formulario y luego llamar a
su método Show(). Eso te permitiría mostrar el formulario, pero como ves es
complejo, poco elegante, y difícil de mantener. Si puedes, yo me inclinaría
por la solución de refactorizar el proyecto para evitar las dependencias
circulares.


Respuesta Responder a este mensaje
#8 rogerrod61
01/03/2008 - 04:17 | Informe spam
Hola, según indicas ya lo solucionaste, el método siguiente puede
darte otra opción, saludos,

Roger

public Form mInstanciaDll(string wSTdll, string wSTcarpeta, string
wSTformulario)
{
 System.Reflection.Assembly
wSTproyecto=System.Reflection.Assembly.LoadFrom(wSTcarpeta);
 wSTformulario = wSTdll + "." + wSTformulario;
 Type wTY = wSTproyecto.GetType(wSTformulario);
 return (Form)Activator.CreateInstance(wTY);
}

Para utilizarlo:

mInstanciaDll("nombreClass", @"..\Carpeta\class.dll",
"nombredelformulario").Show();


Nota:
Si la DLL será externa, enviar en el segundo parámetro la ruta
completa de la carpeta, el nombre de la dll y ".dll".

Si la DLL estará adicionada en las referencias del proyecto, sera
suficiente enviar en el segundo parámetro el nombre de la DLL y ".dll"

Como ejemplo se ha utilizado .dll pero podrá ser la extensión que
tenga el ensamblado (.exe, etc.)
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida