2009-06-16 13 views
10

Cuando construyo un A.sln que incluye 2 proyectos B.csproj y C.csproj que tiene referencias internas de proyecto, arroja errores de referencia en MSBuild. Pero cuando construyo B.csproj y C.csproj por separado en MSBuild, no arroje errores. Y también construir A.sln en VS IDE tampoco arroja errores. Estoy usando el framework .NET 2.0. A continuación, encontrará los scripts utilizados para compilar el sln y los projs.MSBuild construye proyectos con referencias de proyecto correctamente pero no desde la solución

MSBuild "<path>/A.sln" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\A.sln.log /verbosity:normal 

MSBuild "<path>/B.csproj" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\B.csproj.log /verbosity:normal 

MSBuild "<path>/C.csproj" /p:Configuration=Release /p:StartupObject="" /p:WarningLevel=4 /p:Optimize=true /t:rebuild /l:Filelogger,Microsoft.Build.Engine;logfile=F:\C.csproj.log /verbosity:normal 

Editar:

Todos los errores generados son de código para refernces falta (todos son referencias del proyecto). Solo recibo tres tipos de errores como el que se detalla a continuación.

error CS0012: El tipo 'X' se define en un conjunto al que no se hace referencia. Debe agregar una referencia al ensamblado 'Y, Versión = 2.0.0.0, Cultura = neutro, PublicKeyToken = aad4cbe5d7c27078'.

CS0234 de error: El tipo o espacio de nombres 'X' no existe en el espacio de nombres 'Y' (¿falta una referencia asamblea?)

error CS0246: El tipo o espacio de nombres ' X' no se pudo encontrar (¿estás falta una directiva using o una referencia asamblea?)

limpié todas las DLL previamente construidas de caminos de construcción antes de la construcción del IDE y MSBuild. Pero IDE simplemente funciona bien y no muestra un indicador de falta de referencia en la sección "Refrences" para el proyecto.

No se agregaron rutas de referencia manualmente en IDE.

Otro Actualización:

Acabo de notar que cuando abro tanto los proyectos de la solución, las referencias están apuntando correctamente en el IDE. Pero cuando abro los proyectos por separado en IDE, las referencias que faltan que mencioné aparecen en MSBuild. Muy extraño.

Entonces, para resumir,

buiilding .proj en MSBuild - Buena

buiilding .proj en IDE - Error

buiilding .sln en MSBuild - Error

buiilding .sln en IDE - Bueno

Aspecto muy extraño para mi Ayuda mucho apreciada.

+9

Cuando hace una pregunta y dice que hay un error, realmente ayuda cortar y pegar el error. Esto vale para excepciones, errores de compilación, errores de compilación ... –

+0

Por cierto, si compila los dos proyectos individualmente sin problemas, entonces me pregunto si los dos proyectos necesitaban las referencias del proyecto. OTOH, esto podría estar funcionando debido a la función reciente que permite a MSBUILD ser "inteligente" sobre las referencias de proyectos. Como nunca he entendido esa característica, no puedo descartarla; pero le recomiendo que confirme si se requieren todas las referencias del proyecto, y si la reconstrucción B causa la reconstrucción de C. –

+0

@blntechie: gracias por la actualización. Te sugiero que uses Solution Explorer; seleccione cada referencia, en orden, y observe los detalles en la ventana Propiedades. ¿Ves algo extraño, como un ser en obj y los demás en el cubo? Además, si no hay rutas de referencia, ¿no le molestaría mirar sus archivos .csproj.user para asegurarse de que realmente no hay ninguno? –

Respuesta

8

MSBuild y VS usan referencias de proyecto y dependencias de proyectos para elegir el orden de compilación de la solución. Más allá de eso, no está definido, y típicamente es diferente entre los dos. Verifica que ambos sean correctos. Las dependencias del proyecto se establecen en las propiedades de su solución. Si eso no funciona, compruebe dos veces que los GUID en las referencias del proyecto en sus proyectos coinciden con los de la solución. A veces, la recreación de la solución puede solucionarlos.

1

Como mencionó Jon Skeet, un mensaje de error sería útil para saber cuál es el problema. Sin embargo, sin ningún detalle, si se basa en el IDE pero no se crea en MSBuild, parece que podría tener DLL a los que hace referencia en sus proyectos que no están disponibles en la ruta en la que está creando la solución. Tal vez los estaba copiando manualmente en algún lugar donde el IDE podría encontrarlos, o tenía rutas de referencia configuradas en su IDE para buscar en una determinada carpeta.

Algo para comprobar mientras obtiene esos otros detalles sobre la pregunta.

EDITAR: Ahora que hay algunos detalles, podría ser un problema de compilación. ¿Hay una referencia de proyecto en el proyecto B para el proyecto C? Si es así, puede que necesite cambiar el orden para compilar el proyecto C antes del proyecto B.

+0

En mi caso, Proj C hace referencia a Proj B. Y Proj B construye antes de Proj C. – blntechie

3

Algunos puntos a considerar: crear una solución en el IDE no es lo mismo que ejecutar MSBUILD en el archivo .sln. Puede intentar usar devenv.exe/rebuild A.sln en su lugar. El IDE juega varios juegos para permitir la creación de un archivo .sln, incluida la creación de un proyecto "equivalente" estilo MSBUILD.

Además, el IDE no genera directamente los comandos de MSBUILD. Hay interacción entre los dos para mejorar el rendimiento. Por ejemplo, las tareas de CSC en el proyecto probablemente se estén ejecutando dentro del IDE, en lugar de como compilaciones de línea de comandos separadas, ya que MSBUILD las habría engendrado.

También debería considerar obtener Process Monitor desde http://technet.microsoft.com/sysinternals/ para ver a qué archivos se está accediendo.

4

Para mí, cuando he tenido este (o un problema similar), comprobar manualmente (y corregir) la alineación de las guías corrige mi problema. Es molesto rastrear las guías entre los archivos .sln y .csproj, pero funciona.

Normalmente dejo caer la referencia del proyecto y la vuelvo a agregar, y eso soluciona el problema (una vez que he encontrado las guiones desiguales que no coinciden). Quizás debería intentarlo primero. Es mas fácil.

+1

Lo mismo funcionó para mí. La mejor manera que encontré para descubrir qué GUID estaban mal alineados fue eliminar Visual Studio de la ecuación y tratar de compilar únicamente con MSBuild, lo que hace que los errores floten a la superficie. Vea este artículo sobre cómo hacer eso: http://www.codeproject.com/Tips/177770/Creating-MSBuild-projects-from-sln-files.aspx – rohancragg

1

Elimine el ensamblaje de la carpeta GAC ​​(C: \ WINDOWS \ assembly) - seleccione su assebly y haga clic con el botón derecho y desinstálelo.

Porque la solución mantiene la referencia usando guid y si esa guía está en GAC, seguirá tomando la versión de GAC para la compilación.

Cuestiones relacionadas