none
pasar parametrizacion entre proyectos winform y proyectos dll RRS feed

  • Pregunta

  • es dificil definir el titulo de esto, es un tema de manejo de parametrizacion entre proyectos

    situacion del desarrollo:

    proyecto x: proyecto de controles genericos y clases para mis aplicaciones
    es un proyecto general de tipo dll para referenciar luego en mis proyectos
    y hacer uso de sus elementos

    - control personalizado btnSelector: boton personalizado que tiene codigo en el clic
     para llamar a un formulario selector de datos
     -tiene la propiedad pEnsamblado: donde se setea el path
     de la dll que se va a usar en el formulario que se abre al
     hacer clic en el boton personalizado, abre un formulario del proyecto X llamado frmSelector
     como este es un proyecto generico paso en la propiedad pEnsamblado la dll que se usa para mostrar
     datos, en otra propiedad paso la clase a instanciar y el metodo que se ejecuta para mostrar datos
     en la grilla del selector

     

    proyecto W: proyecto de gestion administrativa que usa
    elementos del proyecto x como los controles personalizados

     por ejemplo en el formulario de edicion de clientes
     pido la localidad y tengo el txtbox para ingresar la localidad y el boton personalizado al lado
     porque si el usuario no se acurda de la localidad se llama al selector
     invocando la dll de negocio y ejecutando un metoddo de la clase de negocio de localidades
     el control tirado al lado del control textbox hereda de mi componente  x.btnSelector
     (o sea que hereda del boton perzonalidado del proyecto X y tiene la propiedad pEnsamblado)

    yo puedo poner fijo en la propiedad pEnsamblado el path de la dll ej: c:\pepe\dllnegocio.dll 
    y cuando se abra el selector me va a instanciar la dll y mostrar la localidad

    ahora no quiero configurar a mano o por defecto en el control un path fijo porque x.btnSelector
    es un control generico que voy a usar en otras aplicaciones entonces no l opuedo poner fijo en el proyecto generico x


    lo que quiero lograr es que en la propiedad pEnsamblado: que es donde
    tengo el paht de la dll a instanciar en el proyecto W lo tome de un archivo de configuracion asi luego si cambio de

    directorios no tengo que cambiar la propiedad pEnsamblado en cada control, sino cambiar el archivo de configuracion
    y listo

    ¿hay alguna forma de pasarle desde el proyecto w al x.btnSelector.pEnsamblado el valor de una propiedad
    que guarda el path de alguna forma que para todos mis controles del proyecto W que hereden de este control x.btnSelector?


    yo les cuento una solucion pero seguro habra otra mejor y me gustaria saberlo:

    yo en el proyecto W cree un nuevo control personalizado btnSelectorForenKey y lo hice heredar de x.btnSelector
    y uso este como base para los botones de mi proyecto w en vez de usar el control del proyecto x
    entonces aca puedo setearle un valor fijo a w.btnSelectorForenKey.pEnsamblado y todos los botones selectores
    heredan de este, asi luego si cambia el path solo cambio el control base btnSelectorForenKey

    mi duda es com ollevar datos de parametrizacion de un proyecto particular a una dll generica
    sin tener que andar heredando en cada proyecto y cmabiando para cada uno en particular el path
    del ensamblado que se usa

    ---------------

    otra forma que pienso pero no lo intente es tener definido en el proyecto x una propiedad en una clase estatica pEnsamblado y que desde mi aplicacion en este caso W,  setear esa propiedad con la propiedad pEnsamblado del proyecto W pero deberia ejecutarlo al inicio de mi aplicacion antes de empezar a usar mi formularios y asi cuando en el boton para elegir una localidad se ejecute directamente el codigo para llamar al selector del proeycto X, este antes tenga establecido la propiedad pEnsamblado 

     

    es trabajoso explicar esto, espero que se entienda algo, sino pregunten de nuevo, gracias

     


    programador
    jueves, 8 de abril de 2010 20:16

Respuestas

  • muy dificil de entender, lo cual me pone a dudar respecto a si realmente tienes identificada tu necesidad o aún no logras concretarla.

    yo le apuntaría, en windows , a dos cosas:

    1 - a tener una llave de registro con la ruta de instalacion

    2- lo mas optimo: firmar el ensamblado y mandarlo al  GAC de tal forma que alli este disponible para todas las aplicaciones que lo necesiten y de manera directa sin necesidad de especificar rutas ni nada similar

     

    sin lugar a dudas la solucion 2 es la mas optima , aunque requiere un pequeño esfuerzo adicional y desde luego cambiar algunas cosas del esquema que estas trabajando.

    • Marcado como respuesta rodrigo barboni viernes, 16 de abril de 2010 20:20
    jueves, 8 de abril de 2010 21:10
    Moderador
  • hola

    podrias hacer lo que quieres si usas Reflection

    podrias definir en tu archivo de configuracion el FullyQualifiedName, necesario para poder crear la instancia del componente usando por ahi


    copn este metodo sera ams facil crear una instancia conociendo el nombre de la clase, en realdiad el nombre completo, o sea incluyendo el namespaces

    para tener el FullyQualifiedName podrias usar la tool de Reflector.NET

    con esto podrias crear la instnacia de la clase que defnas por configuracion y ejecutar el metodo, si usas una Interfaz y defines un metodo que implementes en todas las clases que vayas a ejecutar seria lo ideal, asi cuando creas la instancia puedes castear a este tipo de interfaz comun

    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta rodrigo barboni viernes, 16 de abril de 2010 20:20
    viernes, 9 de abril de 2010 14:06

Todas las respuestas

  • hola

    bien, la verdad intente leerlo, pero la verdad me perdi, es un poco larga la explicacion

    no tendrias algun ejemplo corto que explique el tema puntual

     

    si, se que no es facil explicar todo el contexto del problema, pero por ahi algun ejemplo ayude

     

    un comentario, puede ver su dice "nuevo control personalizado btnSelectorForenKey y lo hice heredar de x.btnSelector"

    pero como seria esto, o sea usas algo como ser

    public class btnSelectorForenKey : x.btnSelector
    {

    }

     

    o sea no me cierra esto ya que

    - primero el nombre del control no ayuda si le pones este en el nombre de la clase, en realidad lo comun deberia ser:

    public class SelectorForenKey
    {
    }

    y la instancia de este deberia llamarse btnSelectorForenKey

    SelectorForenKey btnSelectorForenKey = new SelectorForenKey();

     

    -despues x.btnSelector pareciera el uso de una propiedad, o es que son clases anidadas:

    public class x
    {
       public class btnSelector
        {
        }
    }

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 8 de abril de 2010 21:03
  • muy dificil de entender, lo cual me pone a dudar respecto a si realmente tienes identificada tu necesidad o aún no logras concretarla.

    yo le apuntaría, en windows , a dos cosas:

    1 - a tener una llave de registro con la ruta de instalacion

    2- lo mas optimo: firmar el ensamblado y mandarlo al  GAC de tal forma que alli este disponible para todas las aplicaciones que lo necesiten y de manera directa sin necesidad de especificar rutas ni nada similar

     

    sin lugar a dudas la solucion 2 es la mas optima , aunque requiere un pequeño esfuerzo adicional y desde luego cambiar algunas cosas del esquema que estas trabajando.

    • Marcado como respuesta rodrigo barboni viernes, 16 de abril de 2010 20:20
    jueves, 8 de abril de 2010 21:10
    Moderador
  • Hola leandro en realidad, es dificil de explicar con texto, pero voy a tratar de hacerlo mas corto

    tengo el proyecto x que es una dll generica que voy a usar para todas mis aplicaciones que realice o casi todas, ya que en esta dll tengo controles perzonalizados, formularios base de edicion y browse, etc

    en cada aplicacion que desarrollo voy a necesitar un formulario selector que me carga un ensamblado y se ejecuta un metodo determinado de algunas de la clases de ese ensamblado

    lo que quiero es que en cada proyecto particular que desarrolle, el valor de la propiedad pEnsamblado del selector se setee con el de un archivo de configuracion del proyecto particular

    asi podria usar el mismo formulario selector pero en cada proyecto tengo la dll que voy a usar para mostrar datos en un archivo de configuracion

    la idea es unsar un mismo componente de una dll desde disitnos proyectos y de estos proyectos en particular cambiar la propiedad pEnsamblado tomandola de un arhcivo de configuracion, asi si luego cambia un path solo cmabio el archivo de configuracion


    programador
    viernes, 9 de abril de 2010 12:23
  • hola

    podrias hacer lo que quieres si usas Reflection

    podrias definir en tu archivo de configuracion el FullyQualifiedName, necesario para poder crear la instancia del componente usando por ahi


    copn este metodo sera ams facil crear una instancia conociendo el nombre de la clase, en realdiad el nombre completo, o sea incluyendo el namespaces

    para tener el FullyQualifiedName podrias usar la tool de Reflector.NET

    con esto podrias crear la instnacia de la clase que defnas por configuracion y ejecutar el metodo, si usas una Interfaz y defines un metodo que implementes en todas las clases que vayas a ejecutar seria lo ideal, asi cuando creas la instancia puedes castear a este tipo de interfaz comun

    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta rodrigo barboni viernes, 16 de abril de 2010 20:20
    viernes, 9 de abril de 2010 14:06
  • hola leandro, a ver si termino de entender, te entiendo pero me quedan dudas a cerca de la implementacion de interfaz porque si le aplico una interfaz al selector al metodo l ovoy a tener que hacer en el selector y yo quiero que el metodo que setea la propiedad se ejecute en los otros proyectos que usan el general proque ahi es donde estan los parametros

    en mi proyecto general tendria que crear una interfaz con un metodo por ejemplo AsignarPropiedadEnsamblado() y al formulario selector implementarle esa interfaz, asi estoy obligado a escribir el metodo en el formulario selector, pero yo no quiero asignar en el proyecto generico esa propiedad porque depende de cada proyecto en particular que usa la dll general, por ejemplo

    proyecto General X:
       -formulario selector base que tiene la propiedad pEnsamblado


    proyecto W(ejemplo un sistema administrativo):
      -los botones selectores llaman al formulario selector del proyecto general pero antes debo setear correctamente la propiedad pEnsamblado del selector, ya que es el path de una dll de negocio y cada proyecto usa una en particular

    si yo creo la interfaz y se la aplico al selector voy a tener que setear la propiedad en el proyecto general y quiero setear la propiedad en el proyecto W
    por eso decia de crear un formulario que herede de selector del proyecto general y ahi implementar el metodo que le asigne la propiedad, luegoen mis botones selectores llamar siempre a este neuvo form que setea la propiedad pEnsamblado con un valor parametrizable

     

    o sea la idea en general mia era tener la siguiente estructura:

    proyectoX: formulario selector.cs: este tiene un metodo virtual

    proeycto W: tiene un formulario heredado del form selector del proyecto X

    donde sobreescribocon override el metodo virtual para asignar el valor de la propiedad pEnsamblado, asien cada proyecto sobrescribo esa propiedad cuando se ejecuta el codigo del selector de la dll general

    por ahi con la interfaz mejoraria porque en los formularios que herede de selector deberia implementar si o si el metodo y no daria lugar a olvidarme de implementarlo? pero si al selector le implemento el metodo, luego cuando cree un form heredadod de este tendre que impelmentarle el metodo tambien o basta con el que tiene implementao el selector?

    gracias por todo y disculpa el lio


    programador
    • Editado rodrigo barboni viernes, 9 de abril de 2010 20:17 agregado de lineas
    viernes, 9 de abril de 2010 20:11