2009-07-02 11 views
29

Estoy usando MSBuild (a través de NAnt) para compilar un conjunto de ensamblajes VB.NET. Debido a que estos ensambles dependen de COM Interop, necesito garantizar que se ejecutan en modo de 32 bits en sistemas operativos de 64 bits. Puedo hacer que los ensamblados ejecutables se compilen en 32 bits cambiando el proyecto en Visual Studio, pero me gustaría poder forzar a todos los ejecutables a compilarse en el modo de 32 bits en el servidor de compilación.¿Cómo fuerzo a MSBuild a compilar para el modo de 32 bits?

He intentado una serie de parámetros de línea de comandos de MSBuild sin suerte:

  • /p: Plataforma Win32 =
  • /p: Plataforma x 86 =
  • /p: = ProcessorArchitecture x86

¿Qué estoy haciendo mal? ¿Hay alguna referencia a las propiedades que usa MSBuild al compilar proyectos de VB?

Respuesta

18

Si los conjuntos en sí mismos siempre serán de 32 bits, ¿por qué no agregar la configuración al archivo .vbproj? Eso sacará a MSBuild de la ecuación.

Simplemente añadir la siguiente línea a la PropertyGroup inicial en el archivo .vbproj

<PlatformTarget>x86</PlatformTarget> 
+0

No era la respuesta que estaba buscando, pero terminó siendo el más simple/más seguro. –

+0

Si esta no era la respuesta que estabas buscando, ¿por qué fue aceptada? ;-) La respuesta de @Nader debería ser la aceptada. :-) – darrenp

42

Según MSDN, que estás haciendo lo correcto. Parece /p:Platform=x86, pero en realidad, tal vez es /p:PlatformTarget=x86.

Simplemente trato de invocar MSBuild directamente con ese parámetro (asegúrese de que no es un problema con el archivo de NAnt. Mira el resultado de generación para la configuración de generación derecha (depuración/lanzamiento).

+4

+1 la opción -p: PlatformTarget funcionó para mí –

+6

De hecho, Platform es la plataforma de "solución" y PlatformTarget es la plataforma de proyecto. Puede tener el valor personalizado que desee en Platform, pero PlatformTarget debe ser uno de los siguientes: x86, x64, Itanium o anycpu. –

+0

sí, por ejemplo, acabo de utilizar: MSBuild/p: PlatformTarget = "x86"/p: RunCodeAnalysis = False –

3

En Solution Explorer, haga clic con el botón derecho en el nodo raíz ->Configuration Manager. Debe definir una configuración para toda la solución que instruya a cada proyecto dentro de compilar como de 32 bits. (Nota: probablemente ya tenga uno si alguna vez lo configuró al menos un proyecto para compilar como 32 bits). Para obtener un tutorial paso a paso, consulte la publicación de blog de MSDN Solution Configurations.

Luego, especifique la "plataforma" y el "sabor" deseados en sus archivos Team Build.proj/.targets. Por ejemplo:

<ConfigurationToBuild Include="Release|x86"> 
    <FlavorToBuild>Release</FlavorToBuild> 
    <PlatformToBuild>x86</PlatformToBuild> 
</ConfigurationToBuild> 

Puede especificar más de una de estas secciones de propiedad para tener varias combinaciones construidas. Copiaría/pegaría la cadena "Release | x86" (o lo que parezca) directamente desde su archivo .sln para asegurarse de que coincida exactamente; no puede obtenerlo directamente desde Solution Explorer.

En cuanto a su comentario:

MSBuild evaluación de la propiedad es bastante compleja ya que mezcla estilos declarativas e imperativas. Consulte la publicación del blog MSBuild Property Evaluation para obtener más información. Prefiero no confiar en sus sutilezas.

Es cierto que las propiedades especificadas en la línea de comandos deben anular todo lo demás, pero Team Build tiene otra capa de complejidad. The ComputeConfigurationList task is called repeatedly via a recursive MSBuild invokation, not as an ordinary task.La forma en que lo hace es tomar las propiedades ordinarias como PlatformToBuild y envolverlas en un conjunto de propiedades globales llamadas ConfigurationToBuild.PlatformToBuild (etc.) que se generan sobre la marcha, una para cada configuración. Esto hace que el motor de Team Build sea mucho más flexible internamente, pero también hace que el comportamiento de la línea de comandos sea más difícil.

Puede intentar configurar ConfigurationToBuild.PlatformToBuild en la línea de comandos directamente - podría funcionar, no estoy seguro. Pero definitivamente evitará que construyas más de una configuración en una sola definición de compilación. Por esta razón, sigo con mi consejo anterior.

+0

Entonces, ¿qué me ocurre es que no hay una forma de forzar una plataforma específica desde la línea de comandos a menos que el desarrollador configure el proyecto para tener una plataforma x86? Realmente me gustaría evitar ese paso si es posible (ya que no tengo control sobre los proyectos nuevos cuando se crean). –

+0

Sí y no. He editado mi respuesta para proporcionar más detalles. Si realmente desea saber cómo funciona esto, lea (pero no lo toque) el archivo Microsoft.TeamFoundation.Build.targets que se encuentra en% ProgramFiles% \ MSBuild –

1

Después de experimentar el mismo problema exacto, he pasado de utilizar la versión de MSBuild en C:\WINDOWS\Microsoft.NET\Framework64 ... a la versión en C:\WINDOWS\Microsoft.NET\Framework (sin 64) y las cosas se compilan bien.

+0

Los componentes se estaban compilando correctamente en un sistema operativo de 32 bits (no Marco de 64 bits instalado) y luego falla en tiempo de ejecución en un sistema operativo de 64 bits. Pero sospecho que ni siquiera puedes compilar ciertos componentes en el framework de 64 bits, así que es un buen consejo. –

11

Sólo en caso de que esto ayude, he usado esta línea de comandos para construir mi x86 plataforma de destino:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe my.sln /t:build /p:Configuration=Release;Platform=x86 
0

La respuesta Nant msbuild-Tarea a esta pregunta:

<msbuild project="your.sln"> 
    <property name="PlatformTarget" value="x86" /> 
</msbuild> 
0

Para MSBuild versión 15 se es /p: PlatformTarget = x86

Cuestiones relacionadas