2010-08-27 29 views
9

Sto tentando di creare un progetto utilizzando MSBuild (v4.0) su un computer a 64 bit. Per qualche motivo, MSBuild sta tentando di caricare un'estensione a 32 bit e non riesco a capire perché. Ho ridotto il problema al set più piccolo al fine di dimostrare il problema.Perché MSBuild a 64 bit carica estensioni a 32 bit?

Utilizzando il seguente file di progetto MSBuild:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> 
    <Target Name="test"> 
     <Message Text="bin path: $(MSBuildBinPath)" /> 
     <Message Text="extensions path: $(MSBuildExtensionsPath)" /> 
     <Message Text="extensions path (x86): $(MSBuildExtensionsPath32)" /> 
     <Message Text="extensions path (x64): $(MSBuildExtensionsPath64)" /> 
    </Target> 
</Project> 

ottengo questo output:

Microsoft (R) Build Engine Version 4.0.30319.1 
[Microsoft .NET Framework, Version 4.0.30319.1] 
Copyright (C) Microsoft Corporation 2007. All rights reserved. 

Build started 8/27/2010 9:56:35 AM. 
Project "D:\5\test.proj" on node 1 (default targets). 
test: 
    bin path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319 
    extensions path: C:\Program Files (x86)\MSBuild 
    extensions path (x86): C:\Program Files (x86)\MSBuild 
    extensions path (x64): C:\Program Files\MSBuild 
Done Building Project "D:\5\test.proj" (default targets). 


Build succeeded. 
    0 Warning(s) 
    0 Error(s) 

Time Elapsed 00:00:00.03 

MSBuild ovviamente sa circa il percorso a 32bit e 64bit estensioni, e dal percorso binario sembra chiaro che Sto eseguendo il 64-bit MSBuild.exe, ma per qualche motivo ritiene che le estensioni dovrebbero essere caricate da Program Files (x86) anziché da Program Files. Questo mi crea problemi, poiché ho un'estensione che ho bisogno di caricare, che DEVE essere caricata correttamente in un processo a 32 bit/64 bit, e non verrà caricata (MSBuild sta tentando di caricare la versione a 32 bit in un processo a 64 bit).

Perché?

risposta

14

ho filed a bug su Microsoft Connect, ed era chiuso come "By Design", con questa spiegazione:

Hai perfettamente ragione - questo è cambiato, e in senso stretto, è sbagliato ora. Tuttavia, questa è stata una decisione consapevole. Il motivo per cui è stato modificato è che moltissime estensioni (come i file .targets) installate da altri prodotti sono installate solo nella posizione dei file di programma a 32 bit. Non avevano previsto scenari a 64 bit, ma in genere funzionavano bene con MSBuild a 64 bit. Quando un utente esegue MSBuild a 64 bit, che è abbastanza comune ora perché è l'impostazione predefinita per Team Build 2010, MSBuildExtensionsPath avrebbe in passato risolto i file di programma a 64 bit come previsto. Tuttavia, ciò significava che tutti quei file .target non venivano più trovati e la compilazione falliva. Non è stato pratico ottenere tutti questi prodotti per correggere l'authoring della configurazione, soprattutto perché era già stato spedito ai clienti. Quindi abbiamo apportato la modifica per rendere MSBuildExetnsionsPath sempre puntato alla posizione a 32 bit. Quasi nessuno sembra voler davvero la posizione a 64 bit e queste persone possono passare a MSBuildExtensionsPath64. Era davvero una questione di opzione meno cattiva qui.

Accetto le prove, ma non sono d'accordo con la conclusione. Credo che gli autori di programmi di installazione danneggiati meritino che le loro estensioni non funzionino su macchine a 64 bit.

Problemi correlati