2011-01-14 14 views
10

Tengo una solución Visual Studio 2008 .NET C++/CLI. Mi solución consiste en muchos subproyectos. Defino un directorio buid personalizado para cada proyecto y lo llamo Salida.Agregando la misma referencia "* .dll" a múltiples proyectos en la misma Solución

MySoultion

  • MyFirstProject (* .exe)
  • MySecondPrject (* .dll)
  • ...
  • MyNthProject (* .dll)

Cada una de las sub proyecto use Log4.net.So creo un directorio (llamado LogBinary) y pongo log4.net dll en esa carpeta. Luego uso log4net agrego este dll como referencia a cada uno de mis pro Ject ... Pero cuando intento compilar mi proyecto principal (* .exe) Tengo toneladas de advertencia (más de 400 ...)

Sólo un ejemplo:

110 Advertencia advertencia C4945 : 'AbsoluteTimeDateFormatter': no puede importar el símbolo de 'somepath \ log4net.dll': como 'log4net :: :: DateFormatter AbsoluteTimeDateFormatter' ya ha sido importado de otro montaje de 'log4net' "somepath \ log4net.dll "

Un montón de advertencia con

ya ha sido importado de otro montaje

por lo que entré a esta advertencia? ¿Alguien tiene una solución elagant añadir misma DLL para múltiples proyectos (excepto usando GAC)

mejores deseos

Respuesta

1

cambio de referencia sobre los proyectos, establecer todas las propiedades de "copia local de ..." a falso.

Fuente: http://developertips.blogspot.com/2008/07/ccli-warning-c4945.html

+0

Bueno, esto no funciona ... También tiene que hacer que las propiedades "Usar ..." sean falsas para hacer referencia a * .dll ... Pero en esa situación no puede usar ese * .dll ... No es una solución elagant pero lo que encontré es crear un proyecto * .dll vacío agregar referencia a ese * dll (en mi situación agregar log4.net dll a ese proyecto ficticio). Luego, si quería usar ese dll (log4.net) desde otro proyecto agregue ese proyecto ficticio dll en lugar de referencia directa a dll compartido (log4.net) – NoviceAndNovice

0

tenía este mismo problema. Es causada por la siguiente situación, donde un proyecto depende de otro proyecto:

my_solution -> System.Xaml.dll -> System.dll 
my_solution -> System.dll 

Cuando quité la referencia a System.dll (por ejemplo) que resuelve la advertencia del compilador.

+0

Eso no funciona si tiene (digamos) 2 proyectos de jerarquía media que necesitan acceso a proyectos de hoja. Cuando se incluyen los proyectos de nivel medio, se obtiene el proyecto principal quejándose de que los símbolos ya han sido incluidos por uno u otro. –

+0

no hay necesidad de votar por abajo cuando usted no proporcionó una solución usted mismo. Después de años de esta advertencia de compilación, en mi trabajo simplemente hemos desactivado la advertencia de compilación 4945 como completamente inútil. –

+0

Pero no tienes exactamente el mismo problema; el OP dice que todos sus .dll componentes también hacen referencia al proyecto dependiente y, si ese es el caso, lo que ha publicado no resolverá su problema. Si puede publicar una respuesta sobre cómo desactivar las advertencias, me alegraría decir que ... –

0

que tenían la misma advertencia en esta situación:

Solution: 
| 
|-> Project1 : Outdir = "C:\out" 
| 
|-> Project2 : Outdir = [default Outdir] // Was wrong in this case 
| 
|-> Project3 : Outdir = "C:\out" 

Las relaciones dependencias fueron los siguientes.

Solution -> Project1 
Solution -> Project2 -> (Project1) 
Solution -> Project3 -> (Project1, Project2) 

fijación Project2 OutDir a "C: \ out" (como realmente se refiere, que era un proyecto de nueva creación y se olvidó de cambiarlo) fija la advertencia.

5

Finalmente encontré una solución a este problema que no se siente como un truco. He encontrado la respuesta en a response from 'pyro_serv` on the msdn social site:

La solución es utilizar los "Use Dependencias en Build" y "uso en Build" banderas en cada proyecto hace referencia VC (a través de la hoja de propiedades VC), y cambiar según sea apropiado para que su caso resuelva este error.

Así, por ejemplo, de la OP que se ve algo como esto:

Solution -> Log4.net 
Solution -> Proj1 
Solution -> Proj1 -> Log4.net 
Solution -> Proj2 
Solution -> Proj2 -> Log4.net 
... 

La forma de evitar las advertencias es fijar Use Dependencies in Build como false en todas las referencias a Proj1,Proj2,..,Projn.

Acabo de verificar esto con una solución de demostración y funciona muy bien. No puedo creer lo simple que es la solución y cuánto tiempo he desperdiciado para encontrarla.

+1

Solo para su información reciente, recientemente tuve un problema similar derivado de "Usar dependencias" que se establece en True de forma predeterminada, excepto que en mi Además de producir las advertencias, también estaba produciendo C3699. ''^' no puede usar esta indirección en los errores de tipo 'x'', excepto que los tipos en cuestión eran tipos administrados, por lo que debería haber sido capaz de hacerlo. Solo en caso de que alguien más se encuentre con este poco de rareza también. – Miral

+0

esto. exactamente el problema para mí también en Visual-Studio-2005. Establezca 'Usar dependencias en Build = false', agregue las referencias y todo está bien. Uno puede notar que 'Usar dependencias en compilación' ni siquiera existe en la versión VS más reciente (2010 ...) –

0

Tuve el mismo problema otra vez hoy.
En primer lugar, gracias a Jon Cage y el artículo vinculado en su publicación en este hilo, see above (or below). +1 !!! Solucionó mi problema.

Pero como odio cosas como toggle them as appropriate for your case, lo que significa nada más que trial and error, hice algunas pruebas ya que tengo 2 soluciones con un buen número de proyectos C++/CLI en cada una.

Este es mi consejo y explicación para ello:
Para todos 'auto creados' asambleas (que tienen 'copia local' se define como true):

"Propiedades comunes" - Marco>" y Referencias "->" Referencias "-> Seleccione una Referencia.
En la hoja de propiedades a la derecha -> "construcción Propiedades" -> "Use dependencias en construir"
- (copiado del artículo enlazado MSDN foro del puesto de Jon jaula)

Ajuste este parámetro Use Dependencies In Build a "falso" desmarcando.
Funciona como 'reenvío de referencia', ver ejemplo a continuación.

Antecedentes técnicos:
-> significa 'referencias'
método 1:
en mi solución SwCore:
A.1.1 network->tools, A.1.2 network->basics.
A.2.1 tools->basics.
A.3.1 drives->basics, A.3.2 drives->tools, A.3.3 A.4.1 drives->network
...
con "Use dependencias en construir" establecidas en true, el A.1.2 referencia puede ser omitido, ya que está incluido en A.2.1.
todos los archivos se crean en swcore \ Release \
problema ==:
en solución DDI:
B.1.1 DDI_hardware->DDI_job, B.1.2 DDI_hardware->drives
B.2.1 DDI_job->basics, B.2.2 DDI_job->tools, B.2.3 DDI_job->job
DDI_job se crea en DDI \ Release \ y con "U.D.InBuild" establecido en true, incluye basics.
DDI_hardware se crea ... y con "U.D.InBuild" establecido en true, incluye DDI_job->basics.
DDI_hardware también hace referencia a los conceptos básicos de SwCore \ Release \
== >> doble referencia a conceptos básicos y otros. VS ve 2 archivos y no puede darse cuenta de que es el mismo contenido.

método 2:
A.1.1 network->tools, A.1.2 network->basics.
A.2.1 tools->basics.
con "U.D.InBuild" establecido en FALSE, la referencia A.1.2 NO se puede omitir porque no se reenvía desde A.2.1.
== funciona, porque ningún ensamblaje contendrá otras dependencias más profundas, por lo que no habrá conflictos.

BTW: Esto obliga a especificar todas las referencias necesarias para cada proyecto, por lo que también tiene una visión general de lo que está utilizando en su proyecto.

Última información: No puedo asegurarlo, si mi explicación es correcta. Tal vez sea así. otra cosa puede confirmar

Cuestiones relacionadas