msbuild warnings 64bit csc mscorlib

MSBUILD/csc: forma más limpia de manejar x64 mscorlib warning 1607



warnings 64bit (4)

Estoy tratando de usar el sistema de proyecto predeterminado de VS08SP1 para invocar una compilación de C # en modo explícito x64 (a diferencia de AnyCpu ). Cuando marqué explícitamente un módulo como x64, obtengo un:

Advertencia CS1607: Generación de ensamblaje: el ensamblado al que se hace referencia ''mscorlib.dll'' se dirige a un procesador diferente

Una forma de eliminar eso es con a /nowarn:1607 . Basado en mi investigación , no hay problemas en la práctica al hacer esto. Si alguien puede encontrar un problema en el mundo real que haya encontrado, por favor no dude en responder.

Sin embargo, esto simplemente se siente mal! Entonces, otro enfoque que utilicé fue hacer /nostdlib+ , y luego agregar un <Reference> con un <HintPath> a la mscorlib explícitamente de 64 bits:

<Reference Include="mscorlib"> <HintPath>$(windir)/Microsoft.NET/Framework64/v2.0.50727/mscorlib.dll</HintPath> </Reference>

Esto funciona y probablemente sea mejor (a menos que a alguien le interese señalar las razones por las cuales el enfoque anterior es mejor), pero ¿alguien puede confirmar que esto es algo apropiado para hacer, con suerte citando algo autoritario?


Creo que su segunda opción (referencia explícita con /nostdlib+ ) es mejor, porque no suprimirá esta advertencia si tuviera que hacer referencia a otros ensamblados que no se hayan construido en la misma plataforma.


Encontré cambiando el framework Target de mi proyecto a .NET Framework 4, eliminé la advertencia.


En mi caso, tuve esta advertencia porque tenía una combinación de proyectos x86 y x64 en mi solución. Si creo configuraciones de compilación x86 en todos mis proyectos y apunto a eso para la compilación, las advertencias desaparecen. Sin embargo, si quisiera apuntar a x64 en total, creo que tendría que reconstruir el proyecto (o seguir los consejos anteriores) para volver a trabajarlos para el marco x64.


En este blog encontré una propuesta que es demasiado larga para copiarla completamente aquí, pero en resumen la idea se puede describir con un resumen adaptado de este comentario :

En el archivo de proyecto, puede definir una variable personalizada en la sección PropertyGroup para cada configuración de compilación. Ejemplo:

<PropertyGroup Condition="''$(Configuration)|$(Platform)'' == ''Release|x64''"> <MyCustomPath>C:/Windows/Microsoft.NET/Framework64</MyCustomPath> </PropertyGroup>

Solo agrega una etiqueta como

<Reference Include="System.Data"> <HintPath>$(MyCustomPath)</HintPath> </Reference>

y luego use la macro para definir la ruta de referencia. Puede definir MyCustomPath en una ubicación diferente para diferentes configuraciones de compilación (plataforma y / o depuración / versión).
El problema no existiría si MS lo soportara en la interfaz de usuario de VS, pero hasta entonces esto funcionará. Utilizo esta técnica para hacer referencia a diferentes versiones de los mismos ensamblajes en mis compilaciones de depuración y liberación. ¡Funciona genial!

En la recitación anterior, recuperé la etiqueta que se perdió en el comentario de la fuente y cambié la redacción para que fuera algo más detallada.


Una pieza adicional interesante del mismo blog :

Hay otras maneras de hacerlo, pero también requieren una para editar manualmente los archivos del proyecto. Una forma es especificar condiciones para las secciones de PropertyGroup. Esta pregunta de resalta el uso de las condiciones.