MvvmCross程序集从Cirrious.MvvmCross.dll引用,但无法加载:System。

5
我正在尝试建立一个MvvmCross应用程序项目,并对其进行单元测试(即其中的视图模型)。 我在OS X上使用Xamarin Studio(版本为4.0.4,在撰写本文时为最新版本)。 MvvmCross应用程序被设置为便携式类库。 测试程序集被设置为普通的Mono/.Net程序集(而不是PCL),引用了NUnit框架。 在尝试执行测试时,它们会失败并显示System.TypeLoadException。 我已经在Mono binding log上运行了测试。以下是输出内容:

Mono: 以下程序集从 /Users/jr/dev/rowinginmotion-cross/RowingInMotion.Mobile.BoatApp.Tests/bin/Debug/Cirrious.MvvmCross.dll 引用,但无法加载: 程序集: System (assemblyref_index=3) 版本: 2.0.5.0 公钥标记: 7cec85d7bea7798e 系统错误:无效参数

Mono: 无法加载程序集 Cirrious.MvvmCross[0x559960]

Mono: 无法加载文件或程序集 'System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' 或其依赖项之一。

这个测试设置不支持吗?

2个回答

5
这个问题与Xamarin和Mono尚未完全支持可移植类库有关,它们会编译并链接到本地固定的程序集,具体取决于你加载了哪个版本的Mono(例如Xamarin.Android、Xamarin.iOS等),请参见http://slodge.blogspot.co.uk/2013/01/almost-portable-binaries.html以获取更多信息。
在Windows上,您可以使用BindingRedirect功能解决此问题,但我还没有找到任何在Xamarin环境中使用XBuild解决此问题的方法(例如,请参见我的PCL和Mac问题http://forums.xamarin.com/discussion/3733/playing-with-pcls)。
目前我唯一能想到的在完整的.Mac(.Net)项目中加载此代码的方法是使用Xamarin推荐的文件链接方法-复制项目文件并将副本编译为适当的目标。
希望这很快就会改变-因为官方的PCL支持将在未来几天和几周内发布。

1
除了@Stuart的答案(正确),我想发布第二个解决方法,它使我能够实现我的期望场景(在Mac OS和Windows上可测试的PCL程序集)。
这个解决方法依赖于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有条件,似乎仅在其项目组上使用条件并不能使Visual Studio和Xamarin Studio加载/忽略项目引用。 还似乎Xamarin Studio没有正确扩展%(RecursiveDir)...语句,因此文件保留其丑陋的文件名(只要它们隐藏在其_Inlined文件夹中,我就不会在意)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接