1

我目前有一个带有 WP71 项目和一个 WP8 项目的 VS2012 解决方案。这些项目中的每一个都引用了一个可移植类库项目,我在其中保存了视图模型。我还有一个引用 PCL 并包含视图模型测试的单元测试项目。

我遇到的问题是在编译单元测试项目时出现以下错误:

error CS0012: The type 'System.Windows.Input.ICommand' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'

所有项目(包括单元测试项目)都引用 Portable.MvvmLightLibs NuGet 包。

在四处寻找这个程序集后,我注意到有不同的版本,一个用于 WP8,一个用于 Silverlight 4,等等。在所有这些版本中,我不确定该使用哪个。

单元测试项目的目标是 .NET Framework 4.5,因此我为该版本添加了 System.Windows 程序集,但随后出现以下错误:

 error : CA0001 : Could not resolve reference to System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes

看到这是一个代码分析错误,我很想简单地忽略它并继续,但我想知道是否有人对如何解决这个问题有任何想法,或者忽略它是否安全?

4

1 回答 1

2

所以,我想了一个办法来解决这个问题。

要编译测试项目,我必须从以下位置添加System.Windows.dll程序集:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71

但是,即使我直接浏览到该文件夹​​,使用“添加引用”对话框添加它也会自动添加 .NET 4.5 版本。为了解决这个问题,我为测试项目打开了 *.csproj 并替换了以下行:

<Reference Include="System.Windows"/>

<Reference Include="System.Windows">
      <HintPath>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71\System.Windows.dll</HintPath>
</Reference>

这确保了引用 2.0.5.0 版本而不是 .NET 4.5 版本。这种方法的问题是某些类型与其他程序集(即 System.dll)发生冲突,但由于我只是在测试可移植类库中的视图模型,所以我并没有那么烦恼。

理想情况下,测试项目也将是一个可移植类库,但我还没有进行测试。

另一个问题是,在发布模式下构建时,我倾向于将警告显示为错误,因此这总是失败,因为总会有警告抱怨与 System.dll 的命名冲突。

于 2013-03-27T19:31:56.230 回答