すべて同じソースファイルのセットを参照するcsprojファイルのコレクションがありますが、ターゲットデータがわずかに異なるため、プロジェクトファイルを分離しておく必要があります。たとえば、同じプロジェクトのWinPhone、XBox、Desktop、MonoTouchのバリアントがあります。
コンパイルする.csファイルのリストなど、実際に複製されるものについては、リストを1つのファイルに統合して、すべてのバリエーションが同期されていることを確認する必要がないようにします。私はもともと、.csprojsからソースを削除し、それらをすべてのcsprojsによってインポートされた.targetsファイルに入れることでこれを試みましたが、VSとMonoDevelopの両方からソースファイルが消えてしまいました。
2番目の試みは、デスクトップcsprojファイルをプライマリファイルにし、すべてのバリエーションに条件付きロジックを使用してそのcsprojをインポートさせることでした。これにより、ソースファイルがメインのcsprojから編集可能になり、すべてのフレーバーに組み込まれます。これで、Visual Studioは私がやろうとしていたことを理解しましたが、MonoDevelopはそれを構築できません。MonoDevelopソリューションでは、iOSバージョンのコアDLLがグレー表示され、「(アクティブな構成でビルドされていない)」と表示されます。
また、csprojとソリューションをxbuildingしてみました。これは、MonoDevelopが抱えている問題を乗り越えたようですが、monotouchアセンブリの解決に関連する他の問題に問題があります。MonoDevelopがxbuildを使用していると思っていましたが、そうではないでしょうか。
これはWindowsmsbuildで機能するため、Monoではバグまたはサポートされていない機能のようです。あるいは、シナリオ全体に取り組むためのより良い方法があるかもしれません...私はここで尋ねると思いました。
具体的には、MyCore.iOS.csprojファイルは次のようになります。
<?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>
そして、私のCore.csprojファイルは次のようになります。
<?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>
そして、私が言ったように、WinPhoneおよびXBox360プロジェクトにVS Expressを使用すると、このバリエーションが正しく機能しているようです。これはうまくいくはずですか?これを行うためのより良い方法はありますか?
ありがとう、