2010-12-17 3 views
18

Da wir drei Baugruppen, die in expliziter x86 und x64-Versionen kommen, ich habe die entsprechenden CSPROJ Datei bearbeitet (s) zu verwenden, beispielsweise ein Block wie folgt aus:Die plattformspezifische ItemGroup von .csproj funktioniert für Assemblyreferenzen, aber nicht für Inhaltseinbeziehungen?

<ItemGroup Condition=" '$(Platform)' == 'x86' "> 
    <Reference Include="CaliberRMSDK"> 
     <HintPath>..\Libraries\CaliberRMSDK_IKVM\32bit\CaliberRMSDK.dll</HintPath> 
    </Reference> 
    <Content Include="..\Libraries\CaliberRMSDK_IKVM\32bit\ikvm-native.dll"> 
     <Link>ikvm-native.dll</Link> 
     <CopyToOutputDirectory>Always</CopyToOutputDirectory> 
    </Content> 
    <Content Include="..\Libraries\CaliberRMSDK_IKVM\32bit\JVM.dll"> 
     <Link>JVM.dll</Link> 
     <CopyToOutputDirectory>Always</CopyToOutputDirectory> 
    </Content> 
    </ItemGroup> 
    <ItemGroup Condition=" '$(Platform)' == 'x64' "> 
    <Reference Include="CaliberRMSDK"> 
     <HintPath>..\Libraries\CaliberRMSDK_IKVM\64bit\CaliberRMSDK.dll</HintPath> 
    </Reference> 
    <Content Include="..\Libraries\CaliberRMSDK_IKVM\64bit\ikvm-native.dll"> 
     <Link>ikvm-native.dll</Link> 
     <CopyToOutputDirectory>Always</CopyToOutputDirectory> 
    </Content> 
    <Content Include="..\Libraries\CaliberRMSDK_IKVM\64bit\JVM.dll"> 
     <Link>JVM.dll</Link> 
     <CopyToOutputDirectory>Always</CopyToOutputDirectory> 
    </Content> 
    </ItemGroup> 

Wenn das Nachladen. csproj-Datei in Visual Studio 2010 und die Verwendung von "x86" als Plattform funktioniert alles einwandfrei. Wenn Sie "x64" als Plattform wählen, wird die korrekte 64-Bit-Baugruppenreferenz verwendet aber die verknüpfte (<Content Include= ...> ..) immer verwendet die 32-Bit-Einsen (und daher ist die App gebrochen).

Es gibt keine Any-CPU mehr in den Projektdateien und ich hätte "erwartet", dass es für den Inhalt einwandfrei funktioniert, auch, aber es tut es nicht. Gibt es etwas, was mir fehlt?

+0

Haben Sie das ausführliche Protokoll msbuild aktiviert und sehen, was passiert? –

+0

Ich habe es mit einem leeren Projekt getestet, und es funktioniert tatsächlich. Es sollte, wie hier angegeben: http://msdn.microsoft.com/en-us/library/ms171468(v=VS.100).aspx ("Visual Studio untersucht die Bedingungen für PropertyGroup, ItemGroup, Import, Eigenschaft und Elementelemente ... "). Beachten Sie, dass das Tag * Content * bedeutet, dass es sich um eine statische Datei handelt, die Sie sonst nicht verwenden können. Vielleicht wollten Sie es als Referenz-DLL verwenden? Das wird nicht funktionieren, in Ordnung. –

+0

Hrm ... die JVM.dll gibt es nicht eine Assembly-Referenz, sondern eine native, die Funktionen enthält, die p/invoke'ed sind und daher das CopyToOutputDirectory usw. Grundsätzlich ist es nur eine Datei, die ich in der .csproj referenzieren soll kopiert in das Build-Ausgabeverzeichnis (aber in meinem Fall hängt es von dem zu verwendenden Verzeichnis ab). Die Assembly-Referenzen funktionieren in meinem Fall gut, nur die 'referenzierten'/projektspezifischen Referenzdateien nicht. Ich werde morgen früh überprüfen müssen, ob das Msbuild-Log irgendetwas enthält, das mir mehr sagen könnte. –

Antwort

0

Das ist also "nur" ein visuelles Problem. Untergeordnete Builds verwenden die richtigen Referenzen usw., nur VS2010 zeigt die falsche an. Alles gut, nur nicht sichtbar.

0

So wurde diese Frage beantwortet? Wenn nicht, würde ich empfehlen, die Reihenfolge der ItemGroups zu ändern und zu sehen, ob das gegenteilige Ergebnis erreicht wird (dass es in x64 funktioniert, aber auf x86 Visual Studio die falsche Referenz anzeigt).

1

Wir setzen das Condition-Attribut auf das Reference-Element und das funktioniert gut. Vielleicht muss das Condition-Attribut auch zum Content-Element hinzugefügt werden? (Benötigen Sie wirklich sowohl das Referenzelement als auch das Inhaltselement?) Beispiel:

<Reference Include="SomeLib" Condition="$(Platform)=='x86'"> 
    <HintPath>..\..\ThirdParty\SomeLib\clr4\x86\SomeLib.dll</HintPath> 
    <Private>False</Private> 
</Reference> 
<Reference Include="SomeLib" Condition="$(Platform)=='x64' Or $(Platform)=='AnyCPU'"> 
    <HintPath>..\..\ThirdParty\SomeLib\clr4\x64\SomeLib.dll</HintPath> 
</Reference> 
Verwandte Themen