Мультитаргетинг файлов проекта C #с помощью Mono и MonoDevelop

У меня есть коллекция файлов csproj, которые ссылаются на один и тот же набор исходных файлов, но имеют немного разные целевые данные, поэтому мне нужно хранить файлы проекта отдельно. Например. есть варианты WinPhone, XBox, Desktop, MonoTouch того же проекта.

Для вещей, которые действительно дублируются, например, список файлов.cs для компиляции, я хотел бы объединить список в один файл, чтобы мне не приходилось постоянно следить за синхронизацией всех вариантов. Первоначально я пытался сделать это, удалив исходники из.csprojs и поместив их в файл.targets, который был импортирован всеми csprojs, но из-за этого исходные файлы исчезли как из VS, так и из MonoDevelop.

Моя вторая попытка состояла в том, чтобы сделать файл csproj рабочего стола основным и позволить всем вариантам импортировать этот csproj с некоторой условной логикой. Это позволяет редактировать исходные файлы из основного csproj, и они встраиваются во все разновидности. Теперь Visual Studio понимает, что я пытался сделать, но MonoDevelop не может это построить. В решении MonoDevelop версия основной DLL для iOS недоступна и говорит: «(не встроена в активную конфигурацию )»

Я также пробовал xBuild csproj и решение, которое, похоже, решило проблемы. что у MonoDevelop есть проблемы с другими вещами, связанными с разрешением монотач-сборок. Я думал, что MonoDevelop использует xbuild, но, может быть, нет?

Поскольку это работает в Windows msbuild, кажется, что это либо ошибка, либо неподдерживаемая функция в Mono. Или, может быть, есть лучший способ справиться со всем сценарием... Решил спросить здесь.

Для уточнения, Мой файл Core.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>

И,как я уже сказал, вариант этого, похоже, работает правильно при использовании VS Express для проектов WinPhone и XBox360. Это то, что должно работать? Есть лучший способ сделать это?

Спасибо,

8
задан Joe Castro 28 April 2012 в 21:36
поделиться