Ho una raccolta di file csproj che fanno tutti riferimento allo stesso insieme di file sorgente, ma hanno dati di destinazione leggermente diversi, quindi devo tenere separati i file di progetto. Per esempio. ci sono varianti WinPhone, XBox, Desktop, MonoTouch dello stesso progetto.File di progetto C# Mulitargeting con Mono e MonoDevelop
Per cose realmente duplicate, come l'elenco di file .cs da compilare, mi piacerebbe consolidare l'elenco in un singolo file, quindi non continuo a dover verificare che tutte le variazioni siano mantenute in sincronia . Inizialmente ho provato a farlo rimuovendo i sorgenti da .csprojs e inserendoli in un file .targets che è stato importato da tutti i csprojs, ma che ha fatto sparire i file di origine sia da VS che da MonoDevelop.
Il mio secondo tentativo è stato quello di rendere il file csproj del desktop quello principale, e lasciare che tutte le varianti importino quel csproj con una qualche logica condizionale. Ciò mantiene i file di origine modificabili dal csproj principale e li costruiscono in tutti i gusti. Ora Visual Studio capisce cosa stavo cercando di fare ma MonoDevelop non può costruirlo. Nella soluzione MonoDevelop la versione iOS della DLL centrale è disattivata e dice "(non integrata nella configurazione attiva"
Ho anche provato xbuilding il csproj e la soluzione, che sembra superare i problemi che MonoDevelop ha ma singhiozzo su altre cose relative alla risoluzione di monotosse. Avevo pensato che MonoDevelop usasse xbuild, ma forse no?
Dato che questo funziona nel msbuild di Windows sembra che sia un bug o una funzione non supportata in Mono. O forse c'è un modo migliore per affrontare l'intero scenario ... Ho pensato di chiedere qui.
Per ulteriori dettagli, Il mio file Core.iOS.csproj assomiglia a questo:
<?xml version="1.0" encoding="utf-8"?>
<Project
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
DefaultTargets="Build"
ToolsVersion="4.0" >
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>10.0.0</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{AE37B15F-F4BE-48DE-9F20-F00A601EC89E}</ProjectGuid>
<ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<AssemblyName>Core.iOS</AssemblyName>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="monotouch" />
</ItemGroup>
<Import Project=".\Core.csproj" />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>
E il mio file Core.csproj assomiglia a questo:
<?xml version="1.0" encoding="utf-8"?>
<Project
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
DefaultTargets="Build"
ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Core</RootNamespace>
</PropertyGroup>
<!-- Using AssemblyName's presence to check for whether this is imported. -->
<PropertyGroup Condition=" '$(AssemblyName)' == '' ">
<ProductVersion>8.0.50727</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{FC495BD8-11B1-46B0-A9DE-F245A0CBEE94}</ProjectGuid>
<AssemblyName>Core</AssemblyName>
<SignManifests>false</SignManifests>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<!-- properties similar to Debug -->
</PropertyGroup>
<ItemGroup Condition=" '$(Platform)' == 'AnyCPU' ">
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<Import Condition=" '$(AssemblyName)' == 'Core' " Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
<Compile Include="[...]" />
<Compile Include="[...]" />
</Project>
E, come ho detto, un la variazione di questo sembra funzionare correttamente quando si utilizza VS Express per progetti WinPhone e XBox360. È qualcosa che dovrebbe funzionare? C'è un modo migliore per farlo?
Grazie,
Sembra buono, e Monodevelop usa xbuild internamente. Che versione hai installato? – skolima
Grazie per la ricerca. Mentre stavo ricercando questo per rispondere alla domanda io stesso, avevo avuto l'impressione che i progetti MonoTouch ignorassero xbuild e invocassero direttamente mcs, ma potrei averlo interpretato erroneamente o aver guardato un vecchio articolo, ma anche se fosse il caso, non lo farei so quanto l'IDE userebbe xbuild per decidere quali obiettivi sono validi ... La mia versione di MonoDevelop è 2.8.8.4. Per favore fatemi sapere se c'è qualcosa che posso aiutare se avete bisogno di una riproduzione. –