Sobre DLLs y referencias

12/04/2009 - 17:38 por Pedro | Informe spam
Tengo una solucion con varias DLL's las cuales le estoy haciendo muchas
modificaciones. Como es logico para generarlas lo hago para todas a la vez,
dandole a 'Build' a la solucion,

En dos de las DLL's tengo referencias circulares, es decir,

En algunas clases de A.DLL utilizo clases que se encuentran en B.DLL
y en algunas clases de B.DLL utilizo otras clases que estan en A.DLL.

El problema es que cuando le doy a regenerar la solucion si encuentra un
error en una de las dos DLLs citadas se paraliza el proceso de generacion y
se borran ambas DLL's (no el codigo fuente).
Eso hace que aun luego de corregido el error no pueda generar nada ya que
las DLL's no existen fisicamente. Para corregirlo tengo que reemplazar de
un backup una de las DLL's al folder BIN y poder generarlas individualmente,
lo que es bastante tedioso.


Alguna manera de evitar eso aun teniendo las referencias circulares ?

Preguntas similare

Leer las respuestas

#1 Pedro
12/04/2009 - 18:09 | Informe spam
Ademas si es que en .NET no se deben definir referencias circulares entre
DLLs, entonces por qué se permite?

"Pedro" escribió en el mensaje
news:
Tengo una solucion con varias DLL's las cuales le estoy haciendo muchas
modificaciones. Como es logico para generarlas lo hago para todas a la
vez, dandole a 'Build' a la solucion,

En dos de las DLL's tengo referencias circulares, es decir,

En algunas clases de A.DLL utilizo clases que se encuentran en B.DLL
y en algunas clases de B.DLL utilizo otras clases que estan en A.DLL.

El problema es que cuando le doy a regenerar la solucion si encuentra un
error en una de las dos DLLs citadas se paraliza el proceso de generacion
y se borran ambas DLL's (no el codigo fuente).
Eso hace que aun luego de corregido el error no pueda generar nada ya que
las DLL's no existen fisicamente. Para corregirlo tengo que reemplazar de
un backup una de las DLL's al folder BIN y poder generarlas
individualmente, lo que es bastante tedioso.


Alguna manera de evitar eso aun teniendo las referencias circulares ?



Respuesta Responder a este mensaje
#2 RFOG
12/04/2009 - 22:27 | Informe spam
Buena pregunta.

Por lo mismo que se permiten en el código fuente: es un error de diseño
garrafal para solventar otro error de diseño más garrafal todavía en
relación a la inexistiencia de objetos globales y a la imposibilidad de
tener declaraciones adelantadas, además de incluir el código de la clase
en la propia declaración de la misma (con esto no quiero decir que se
debía haber resuelto de la misma forma que se hace en C++, que genera
otros temas relacionados con el rendimiento de la compilación), pero sí de
alguna otra forma.

Una medio solución, creo, son las clases parciales. Declaras y defines una
parte de una clase en un fichero y otra parte en otro y así solventas el
tema (o eso creo, realmente no lo he probado y no sé si funcionará). Lo
que considero es otra chapuza de C# para poder tener XAML... pero esa es
otra guerra.

De todos modos tu también tienes un error bastante serio en tu diseño:
divide esos dos ensamblados en tres, uno de ellos con el comportamiento
común, o júntalos ambos en un solo ensamblado y saca satélites si es
necesario. O desdobla la jerarquía en tres clases o grupos de clases o
junta ambas en una sola y sacas en otra el comportamiento problemático.
Todas estas operaciones tienen nombre pero ahora no lo recuerdo...

On Sun, 12 Apr 2009 18:09:15 +0200, Pedro wrote:

Ademas si es que en .NET no se deben definir referencias circulares entre
DLLs, entonces por qué se permite?

"Pedro" escribió en el mensaje
news:
Tengo una solucion con varias DLL's las cuales le estoy haciendo muchas
modificaciones. Como es logico para generarlas lo hago para todas a la
vez, dandole a 'Build' a la solucion,

En dos de las DLL's tengo referencias circulares, es decir,

En algunas clases de A.DLL utilizo clases que se encuentran en B.DLL
y en algunas clases de B.DLL utilizo otras clases que estan en A.DLL.

El problema es que cuando le doy a regenerar la solucion si encuentra un
error en una de las dos DLLs citadas se paraliza el proceso de
generacion
y se borran ambas DLL's (no el codigo fuente).
Eso hace que aun luego de corregido el error no pueda generar nada ya
que
las DLL's no existen fisicamente. Para corregirlo tengo que reemplazar
de
un backup una de las DLL's al folder BIN y poder generarlas
individualmente, lo que es bastante tedioso.


Alguna manera de evitar eso aun teniendo las referencias circulares ?







Respuesta Responder a este mensaje
#3 Mauricio Atanache
14/04/2009 - 03:44 | Informe spam
Estoy de acuerdo, aunque el compilador no debería permitir dichas
referencias cruzadas, pienso que una revisión de tu jerarquía de clases te
mostrará que mediante un refactoring, debe ser posible evitar que dicha
situación se presente.

Cordial saludo,


Mauricio Atanache G.

"RFOG" escribió en el mensaje de
noticias:
Buena pregunta.

Por lo mismo que se permiten en el código fuente: es un error de diseño
garrafal para solventar otro error de diseño más garrafal todavía en
relación a la inexistiencia de objetos globales y a la imposibilidad de
tener declaraciones adelantadas, además de incluir el código de la clase
en la propia declaración de la misma (con esto no quiero decir que se
debía haber resuelto de la misma forma que se hace en C++, que genera
otros temas relacionados con el rendimiento de la compilación), pero sí de
alguna otra forma.

Una medio solución, creo, son las clases parciales. Declaras y defines una
parte de una clase en un fichero y otra parte en otro y así solventas el
tema (o eso creo, realmente no lo he probado y no sé si funcionará). Lo
que considero es otra chapuza de C# para poder tener XAML... pero esa es
otra guerra.

De todos modos tu también tienes un error bastante serio en tu diseño:
divide esos dos ensamblados en tres, uno de ellos con el comportamiento
común, o júntalos ambos en un solo ensamblado y saca satélites si es
necesario. O desdobla la jerarquía en tres clases o grupos de clases o
junta ambas en una sola y sacas en otra el comportamiento problemático.
Todas estas operaciones tienen nombre pero ahora no lo recuerdo...

On Sun, 12 Apr 2009 18:09:15 +0200, Pedro wrote:

Ademas si es que en .NET no se deben definir referencias circulares entre
DLLs, entonces por qué se permite?

"Pedro" escribió en el mensaje
news:
Tengo una solucion con varias DLL's las cuales le estoy haciendo muchas
modificaciones. Como es logico para generarlas lo hago para todas a la
vez, dandole a 'Build' a la solucion,

En dos de las DLL's tengo referencias circulares, es decir,

En algunas clases de A.DLL utilizo clases que se encuentran en B.DLL
y en algunas clases de B.DLL utilizo otras clases que estan en A.DLL.

El problema es que cuando le doy a regenerar la solucion si encuentra un
error en una de las dos DLLs citadas se paraliza el proceso de
generacion
y se borran ambas DLL's (no el codigo fuente).
Eso hace que aun luego de corregido el error no pueda generar nada ya
que
las DLL's no existen fisicamente. Para corregirlo tengo que reemplazar
de
un backup una de las DLL's al folder BIN y poder generarlas
individualmente, lo que es bastante tedioso.


Alguna manera de evitar eso aun teniendo las referencias circulares ?










Respuesta Responder a este mensaje
#4 Harvey Triana
14/04/2009 - 16:45 | Informe spam
Trata de estructurar mejor tu aplicación, así te cueste más líneas de
código. Se practico. Si no lo haces los Bugs que vas a introducir te darán
muchas horas de insomnio.
<Harvey Triana />
http://vexpert.mvps.org

"Pedro" escribió en el mensaje de noticias
news:
Tengo una solucion con varias DLL's las cuales le estoy haciendo muchas
modificaciones. Como es logico para generarlas lo hago para todas a la
vez, dandole a 'Build' a la solucion,

En dos de las DLL's tengo referencias circulares, es decir,

En algunas clases de A.DLL utilizo clases que se encuentran en B.DLL
y en algunas clases de B.DLL utilizo otras clases que estan en A.DLL.

El problema es que cuando le doy a regenerar la solucion si encuentra un
error en una de las dos DLLs citadas se paraliza el proceso de generacion
y se borran ambas DLL's (no el codigo fuente).
Eso hace que aun luego de corregido el error no pueda generar nada ya que
las DLL's no existen fisicamente. Para corregirlo tengo que reemplazar de
un backup una de las DLL's al folder BIN y poder generarlas
individualmente, lo que es bastante tedioso.


Alguna manera de evitar eso aun teniendo las referencias circulares ?



Respuesta Responder a este mensaje
#5 Jerónimo Milea
10/05/2009 - 20:33 | Informe spam
De hecho VS no permite las referencias circulares, es decir, no
referenciando los proyectos, para hacer esto tu estás referenciando
directamente la dll, no el proyecto, esto es, a todas luces, una muy mala
práctica...
Ahora, a tu problema puntual, yo lo resuelvo, siempre que necesito hacer
algo similar, usando una dll intermedia...

Si todavía quieres seguir haciéndolo como hasta ahora (no lo recomiendo para
nada) puedes usar un "post build" para hacer que uno copie la dll resultante
en el directorio bin del otro y viceversa.

Espero te sirva
Jerónimo Milea

"Pedro" escribió en el mensaje de
noticias:
Tengo una solucion con varias DLL's las cuales le estoy haciendo muchas
modificaciones. Como es logico para generarlas lo hago para todas a la
vez, dandole a 'Build' a la solucion,

En dos de las DLL's tengo referencias circulares, es decir,

En algunas clases de A.DLL utilizo clases que se encuentran en B.DLL
y en algunas clases de B.DLL utilizo otras clases que estan en A.DLL.

El problema es que cuando le doy a regenerar la solucion si encuentra un
error en una de las dos DLLs citadas se paraliza el proceso de generacion
y se borran ambas DLL's (no el codigo fuente).
Eso hace que aun luego de corregido el error no pueda generar nada ya que
las DLL's no existen fisicamente. Para corregirlo tengo que reemplazar de
un backup una de las DLL's al folder BIN y poder generarlas
individualmente, lo que es bastante tedioso.


Alguna manera de evitar eso aun teniendo las referencias circulares ?



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida