Невозможно создать подделки для сборки, ссылающейся на переносимую библиотеку классов

Я не могу сгенерировать сборку Microsoft Fakes для библиотеки классов (.NET 4.5), когда указанная библиотека классов ссылается на PCL (Portable Class Library), нацеленную на .Net 4.5 и Silverlight 5 в Visual Studio 2013.

Это происходит только в том случае, если библиотека классов (.NET 4.5):

  1. Объявляет тип, производный от типа, который можно найти в System.dll v4.0.0.0 и v2.0.5.0.
  2. Объявляет другой тип, производный от типа, объявленного в библиотеке PCL, который, в свою очередь, является производным от типа, объявленного в System.dll v.2.0.5.0.

И библиотека классов .NET 4.5, и библиотека PCL компилируются нормально. Однако у меня есть проект модульного теста (также .NET 4.5), который должен генерировать фейки для библиотеки классов .NET 4.5. Попытка сгенерировать подделки не удалась и выдает следующую ошибку.

error : assembly Repro.dll failed to load properly Could not resolve assembly 'System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes'. Are you missing an assembly reference?

Попытка добавить ссылку на System.Dll v2.0.5.0 в моем проекте модульного теста не удалась, поскольку ссылка на компонент System v4.0.0.0 уже существует в проекте.

Я также попытался добавить App.Config в свой проект Unit Test и определить перенаправление привязки сборки для System.Dll, но это не сработало. Я подозреваю, что перенаправление привязки сборки не влияет на генерацию подделок.

Воспроизвести проблему легко.

Создайте переносимую библиотеку классов с именем Repro.Portable, имеющую единый интерфейс:

using System.ComponentModel; 

namespace Repro.Portable
{
   public interface IPortableEntity : INotifyPropertyChanged
   {
   }
}

Затем создайте библиотеку классов .NET 4.5 с именем Repro, которая ссылается на переносимую библиотеку классов, и объявите следующие два интерфейса.

using Repro.Portable;

namespace Repro
{
  public interface ISpecializedEntity : IPortableEntity
  {
  }
}

а также...

using System.ComponentModel;

namespace Repro
{
  public interface IOtherInterface : INotifyPropertyChanged
  {
  }
}

Наконец, создайте проект модульного теста, ссылающийся на сборки Repro и Repro.Portable. Компиляция на этом этапе будет успешной. Однако попытка создать Microsoft Fakes для сборки Repro не удастся.

Поскольку все это кажется вполне законным, мне остается только гадать, столкнулся ли я с ошибкой в ​​генераторе Microsoft Fakes или существует обходной путь.

Есть ли способ заставить работать генерацию фейков, или я застрял с использованием другой структуры Mocking при столкновении с этим конкретным сценарием?


person PL_    schedule 08.03.2014    source источник
comment
Я подозреваю, что это ошибка. Можете ли вы подать его на connect.microsoft.com?   -  person Daniel Plaisted    schedule 10.03.2014
comment
Я тоже так думаю. Я отправил отчет об ошибке в MS Connect connect.microsoft.com/VisualStudio/feedback/details/830500/   -  person PL_    schedule 10.03.2014


Ответы (1)


Microsoft предоставила обходной путь для ошибки.

Чтобы решить эту проблему, добавьте большой двоичный объект XML, как показано ниже, в свой файл .fakes.

<Compilation>
   <Reference Path="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0\Profile\Profile158\System.dll" FullName="System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e"/>
</Compilation>

Он действительно работает при локальной сборке, однако мне еще предстоит проверить, является ли это жизнеспособным обходным путем при использовании сервера онлайн-сборки TFS или нет.

person PL_    schedule 13.03.2014
comment
И пока вы это делаете, убедитесь, что вы ссылаетесь на правильную версию. Тот факт, что указанная сборка v2.0.5.0 не означает, что вы должны добавить в файл .fakes версию v2.0.5.0 (профиль клиента 4.0). Стало странно Метод xxxx не реализовал ошибки, пока я не изменил ссылку в файле .fakes на C:\windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll (с соответствующим полным именем). Обратите внимание, что наличие обеих ссылок не работает. Мне нужно было заменить ссылку из этого ответа на 4.0.0.0. - person lc.; 28.07.2015