Ошибка Moles 0.94.51023.0 на VS 2010 SP1 - PullRequest
6 голосов
/ 12 мая 2011

Я пытаюсь вызвать System.ServiceModel v4 в VS 2010 SP1 с Moles 0.94.51023.0, и постоянно получаю следующую ошибку: Имя типа или пространства имен 'IHttpCookieContainerManager' не существует в пространстве имен 'ssm:: System.ServiceModel.Channels '(вам не хватает ссылки на сборку?) [My-test-project.Test \ obj \ Debug \ Moles \ ssm \ mgcsproj] my-test-project.Test \ mgcs 293022 43

Этот интерфейс, кажется, был удален из System.ServiceModel.dll в .NET 4.0, поскольку я могу найти его только в System.ServiceModel.dll v2.0.5.0 (Silverlight) при поиске в Обозревателе объектов.

Я могу воспроизвести это через cmdline, используя moles.exe, и я попытался изменить файл moles, чтобы генерировать только имена типов, которые я указал, но это, похоже, не имеет никакого значения.Это работало нормально до моего обновления до VS2010 SP1, поэтому я подозреваю, что это ошибка, но любая помощь будет признательна.

Спасибо Ник

Ответы [ 4 ]

5 голосов
/ 18 мая 2011

Я также отладил это самостоятельно и обнаружил, что основной причиной, по-видимому, является то, что VS2010 SP1 (и соответствующее обновление GDR KB для .NET 4 ) обновляет один набор DLL, но не другой:

System.ServiceModel.dll в% ProgramFiles (x86)% \ Referenced Assemblies \ не совпадает с тем, который установлен в .NET v4 при установке% windir% \ Microsoft.NET \ Framework64 \ v4.0.30319...

Пост VS 2010 Обновление SP1:

% Программные файлы (x86)% \ Ссылочные сборки \ Microsoft \ Framework.NETFramework \ v4.0 \ System.ServiceModel.dll -> Версия файла4.0.30319.1

% windir% \ Microsoft.NET \ Framework64 \ v4.0.30319 \ System.ServiceModel.dll -> Версия файла 4.0.30319.225

Сравнение этих двух библиотек в браузере объектов вVS, а также в Reflector выдает результат, что интерфейс IHttpCookieContainerManager был удален в новом файле.Так что я подозреваю, что это комбинация .NET-поиска, обнаруживающего более новую DLL и моли, отражающуюся над старшей при выполнении родинки / заглушки.Мне удалось вручную сгенерировать DLL Moles для более новой DLL, запустив exe Moles вручную без каких-либо ссылок на пути, в отличие от цели MSBuild, которая добавляет кучу ссылок ref во время сборки.

4 голосов
/ 14 мая 2011

Я не знаю , почему это происходит, но у меня была та же проблема, и я решил ее, используя фильтры типа Moles, и включил только те, которые мне действительно нужны (что имеет приятную сторону -Эффект ускорения компиляции довольно много !!).Это пример .moles файла, который я использую:

<Moles xmlns="http://schemas.microsoft.com/moles/2010/">
  <Assembly Name="System.ServiceModel"/>
  <StubGeneration>
    <Types>
      <Clear/>
      <Add Namespace="System.ServiceModel.Description!"/>
    </Types>
  </StubGeneration>
</Moles>
1 голос
/ 01 апреля 2013

Похоже, что это был конфликт между сборками System и System.ServiceModel, которые Moles использовал для компиляции.

Я недавно установил Microsoft .NET Framework 4.5.

После удаленияэто и переустановка 4.0 все работало.

0 голосов
/ 06 января 2016

Что ж, если кто-то работает с унаследованным кодом и оказывается вовлеченным в использование Microsoft Moles, я тщательно изучил эту тему и надеюсь избавить некоторых от гнева и разочарования, с которыми я столкнулся.

Я попытался использовать предложенный ответ, который означал переход в каталог Moles (в C: \ Program Files ..) и запуск утилиты командной строки (moles.exe) в качестве администратора. Существует множество опций, одна из которых позволяет вам включать сборки, на которые есть ссылки (как предложено выше).

Однако, даже при попытке запустить утилиту без ссылочных сборок, утилита в конечном счете вызывает компилятор C # (csc.exe) с предварительно определенными ссылочными путями сборки, и я заключаю, что возникает путаница между версиями .NET Framework , Я не смог получить , а не , чтобы включить эти пути сборки.

Мой конкретный сценарий состоял в том, что я пытался Mole пользовательской сборки, однако, поскольку, очевидно, на этом компьютере был установлен .NET 4.5, он жаловался на компиляцию о System.Collections.Generics IReadOnlyCollection, IReadOnlyDictionary и, я думаю, один другой.

Решение : единственное решение , которое я получил, заключалось в использовании фильтров Mole, о которых я читал в других публикациях и на веб-сайте Microsoft Moles (есть специальная ссылка для Устранение неполадок .NET 4.5 на главной странице). В Visual Studio я просто добавил сборку Moles в свой проект модульного тестирования для своей пользовательской сборки, на которую ссылаются, щелкнув правой кнопкой мыши в обозревателе решений. Затем я попытался построить. Для каждой ошибки, которую я получал, я отмечал классы-нарушители и исключал их из Shimmed или Stubbed, добавляя в файл родинок следующее:

<Moles xmlns="http://schemas.microsoft.com/moles/2010/">
  <Assembly Name = "MyCustomAssembly" />
  <StubGeneration>
    <Types>
      <Remove TypeName="ClassThatUsesIReadOnlyCollectionEtc" />
    </Types>
  </StubGeneration>
  <MoleGeneration>
    <Types>
      <Remove TypeName="ClassThatUsesIReadOnlyCollectionEtc" />
    </Types>
  </MoleGeneration>
</Moles>

Теперь ясно, что это не сработает, если вам понадобятся классы, которые вы исключаете из генерации моль / огрызок, однако для моего случая это работало нормально, потому что классы-нарушители не были важны, и я бы не стал ' Тебе не нужно что-то заглушки или Шим в этих классах.

...