事实证明,这在 MSBuild 中是完全可能的。假设您从一个为 Windows .NET 创建的 C# 项目开始,并且还想为 iOS 编译,那么关键点如下。注意:这不适用于 MonoDevelop。它仅适用于 Visual Studio。这是因为 MonoDevelop 目前没有为 MonoTouch 使用成熟的 MSBuild 兼容构建系统。
- 为 iOS 创建一个新的解决方案和项目平台,命名为 iOS。这用于为 MonoTouch 编译项目。您可以将其命名为任何您想要的名称,但在下文中始终使用该名称。
对于 iOS 平台,将 NoStdLib 设置为 true 以避免自动引用 mscorlib.dll。还将路径设置为包含 MonoTouch dll 的本地副本的目录,从 Mac 上的 MonoTouch 安装中复制:
<PropertyGroup Condition="'$(Platform'=='iOS'">
<NoStdLib>true</NoStdLib>
<iOSLibs>c:\MonoTouch\</iOSLibs>
</PropertyGroup>`
添加对文件夹中所有引用的 MonoTouch 程序集的本地副本的引用:
<ItemGroup Condition="'$(Platform'=='iOS'">
<Reference Include="mscorlib">
<HintPath>$(iOSLibs)\mscorlib.dll</HintPath>
</Reference>
<Reference Include="System">
<HintPath>$(iOSLibs)\System.dll</HintPath>
</Reference>
<Reference Include="System.Core">
<HintPath>$(iOSLibs)\System.Core.dll</HintPath>
</Reference>
<Reference Include="System.Xml">
<HintPath>$(iOSLibs)\System.Xml.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq">
<HintPath>$(iOSLibs)\System.Xml.Linq.dll</HintPath>
</Reference>
<Reference Include="monotouch">
<HintPath>$(iOSLibs)\monotouch.dll</HintPath>
</Reference>
</ItemGroup>
Visual Studio 自动添加一个引用所有 .NET 程序集的 ItemGroup。由于我们已经指示 Visual Studio/MSBuild 在为 iOS 构建时从 iOSLibs 文件夹中获取这些,我们应该有条件地禁用默认程序集。这可以阻止 VS 抱怨重复的程序集引用。更改 的第一行ItemGroup
并添加条件,如下所示。(注意:程序集列表将根据您的项目当前引用的内容而有所不同。)
<ItemGroup Condition=" '$(Platform)' != 'iOS' ">
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
现在你准备好了。为解决方案中的所有项目完成此操作后,您可以从解决方案下拉列表中选择 iOS,并像魔术一样构建 MonoTouch 二进制兼容程序集,而无需使用可移植类库!(这并不意味着 PCL 没有用,它们当然有用,但这里显示的技术更普遍适用。)
更详细地了解 MSBuild 及其强大的功能将帮助您进一步简化,例如:
- 将上述大部分内容移动到一个通用的 MSBuild 文件中,您可以从所有项目文件中引用该文件以消除重复。
- 使用定义编译器常量
<DefineConstants>...</DefineConstants>
以允许您的代码根据当前的解决方案和配置以不同的方式做事。