除了@Stuart 的答案(这是正确的),我想发布第二个解决方法,我发现它可以让我实现我想要的场景(PCL 程序集可在 Mac OS 和 Windows 上测试)。
此解决方法依赖于引入对通配符包含的支持的 Xamarin Studio 4.0.5(或更高版本)。
具体来说,在 Windows 上编译时,我编译 PCL 并从测试程序集中添加一个项目引用。在 Mac OS 上,我也编译了“PCL”(目前还没有真正的 PCL 支持),但我在测试程序集中保持不变。相反,我将通配符包含来自 PCL 项目的所有代码到测试程序集中,因此我在 OS X 上的测试程序集中有测试+代码。
这需要一些 MSBuild 魔法(用于在 Windows 和 OS X 版本之间切换 MvvmCross 引用的类似技巧)。在项目顶部包含此 .targets 文件:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
<MvvmCrossPlatform>VS2012</MvvmCrossPlatform>
<PclSupport>true</PclSupport>
</PropertyGroup>
<PropertyGroup Condition=" '$(OS)' != 'Windows_NT'">
<MvvmCrossPlatform>XS-iOS-Mac</MvvmCrossPlatform>
<PclSupport>false</PclSupport>
</PropertyGroup>
</Project>
然后在您的单元测试 .csproj 中:
<ItemGroup Condition=" '$(PclSupport)' == 'false' ">
<Compile Include="..\RowingInMotion.Mobile.Backend\**\**.cs">
<Link>_Inlined\%(RecursiveDir)%(FileName)%(Extension)</Link>
</Compile>
</ItemGroup>
<Choose>
<When Condition=" '$(PclSupport)' == 'true' ">
<ItemGroup>
<ProjectReference Include="..\RowingInMotion.Mobile.Backend\RowingInMotion.Mobile.Backend.csproj">
<Project>{0B448743-182C-4ADC-8E97-7F9E7EF3A03A}</Project>
<Name>RowingInMotion.Mobile.Backend</Name>
</ProjectReference>
</ItemGroup>
</When>
</Choose>
请注意,我必须使用 Choose 构造来使 ProjectReference 有条件,似乎只是在其项目组上使用 Condition 不会使 Visual Studio 和 Xamarin Studio 加载/忽略项目引用。Xamarin Studio 似乎也没有正确扩展%(RecursiveDir)...
语句,因此文件保留了它们丑陋的文件名(只要它们隐藏在它们的 _Inlined 文件夹中,我就不会在意)。