나는 모두 동일한 소스 파일 세트를 참조하지만 약간 다른 대상 데이터가 있으므로 프로젝트 파일을 별도로 유지해야하는 csproj 파일 모음이 있습니다. 예 : 동일한 프로젝트의 WinPhone, XBox, Desktop, MonoTouch 변종이 있습니다.Mono 및 MonoDevelop와 함께 다중 타겟 C# 프로젝트 파일
실제로 컴파일되는 .cs 파일 목록과 같이 목록을 단일 파일로 통합하여 모든 유사 콘텐츠가 동기화되어 있는지 확인하지 않아도됩니다. . 원래는 .csprojs에서 소스를 제거하고 모든 csprojs에서 가져온 .targets 파일에 넣었지만 소스 파일을 VS와 MonoDevelop에서 모두 사라지게 만들었습니다.
내 두 번째 시도는 데스크톱 csproj 파일을 기본 파일로 만들고 모든 유사 콘텐츠를 일부 조건부 논리를 사용하여 해당 csproj를 가져 오는 것입니다. 이렇게하면 소스 파일을 기본 csproj에서 편집 할 수 있으며 모든 형식으로 빌드 할 수 있습니다. 이제 Visual Studio는 내가하려고했던 것을 이해하지만 MonoDevelop는 그것을 구축 할 수 없습니다. MonoDevelop 솔루션에서 코어 DLL의 iOS 버전이 회색으로 표시되고 "활성 구성에 내장되어 있지 않습니다"라고 말합니다.
또한 MonoDevelop의 문제점을 해결할 수있는 csproj 및 솔루션을 xbuilding 해본 결과 모노 터치 어셈블리를 해결하는 것과 관련하여 다른 문제가 있습니다. 나는 MonoDevelop가 xbuild를 사용했다고 생각했지만, 그렇지 않을 수도 있습니다.
Windows msbuild에서 작동하므로 Mono에서 버그 또는 지원되지 않는 기능인 것 같습니다. 아니면 전체 시나리오를 해결할 수있는 더 좋은 방법이있을 것입니다.
<?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 파일은 다음과 같습니다 : 세부 사항에 대한
이 내 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>
<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를 사용하면이 변형이 올바르게 작동하는 것 같습니다. 이게 효과가 있어야 할 부분인가? 이 작업을 수행하는 더 좋은 방법이 있습니까?
감사합니다,
좋은데 Monodevelop는 내부적으로 xbuild를 사용합니다. 어떤 버전을 설치하셨습니까? – skolima
감사합니다. MonoTouch 프로젝트가 xbuild를 우회하여 직접 mcs를 호출한다는 인상을 받았지만 이전 기사를 읽거나 잘못 읽었을 수도 있습니다.하지만 그 경우에도 ' IDE가 xbuild를 사용하여 유효한 대상을 결정하는 방법을 알고 있습니다 ... MonoDevelop의 내 버전은 2.8.8.4입니다. 재판이 필요하면 도와 드릴 수있는 것이 있는지 알려주세요. –