Нельзя использовать родинки, чтобы издеваться над фреймворком MVC - PullRequest
5 голосов
/ 08 июля 2011

Я пытаюсь сгенерировать родинки для System.Web.Mvc DLL версии 3, но получаю следующую ошибку:

 Moles : info : metadata : loading C:\TFS.as12.Projects\Project X\Main\Source\3rdPartyComponents\MVC3\System.Web.Mvc.dll
    Moles : info : compilation : output assembly name: System.Web.Mvc.Moles
Moles : warning : metadata : failed to load module System.Web.Mvc.dll:
Moles : warning : metadata : Inheritance security rules violated by type: 'System.Web.Mvc.CompareAttribute'. Derived types must either match the security accessibility of the base type or be less accessible.
Moles : warning : metadata : Inheritance security rules violated by type: 'System.Web.Mvc.RemoteAttribute'. Derived types must either match the security accessibility of the base type or be less accessible.
Moles : error : code : assembly contains no types or failed to load properly
  00:00:00.53> moles generator 1 errors, 3 warnings

    Moles compilation FAILED - 6,18794176354816s
C:\Program Files (x86)\Microsoft Moles\bin\Microsoft.Moles.targets(79,5): error MSB3073: The command ""C:\Program Files (x86)\Microsoft Moles\bin\moles.exe" @"C:\TFS.as12.Projects\Project X\Main\Source\X.Web\X.Web.Base.Mvc.UnitTest\obj\Debug\Moles\moles.args"" exited with code -1002.

Я видел больше вопросов по этому поводу на форумах Microsoft, но никогда не отвечал. У кого-нибудь есть решение?

Ответы [ 3 ]

3 голосов
/ 28 октября 2011

Это связано с известной проблемой .Если у вас настроено использовать Moles с MVC3, вы можете сделать следующее (я сделал это):

  1. Загрузить исходный код MVC3 .
  2. Удалите [SecurityTransparent] из Properties / AssemblyInfo.cs
  3. Извлеките открытый ключ MS из реальной библиотеки MVC, используя sn.exe: "sn -e System.Web.Mvc.dll ms_public_key.snk"
  4. Скажите VS использовать этот открытый ключ при подписании вашей поддельной MVC-библиотеки DLL (вы можете сделать это в свойствах проекта, подписание).Убедитесь, что вы отметили поле «только знак задержки».
  5. Сборка.Теперь у вас есть поддельная dll MVC, подписанная открытым ключом MS.Но вы не можете использовать его ни для чего, потому что он не пройдет проверку подписью.
  6. Снова используйте sn.exe, чтобы зарегистрировать пропущенную проверку для вашей поддельной dll: "sn -Vr System.Web.Mvc.dll "<--- это должен быть ваш <em>фальшивый один
  7. GAC ваш фальшивый с gacutil.exe:" gacutil -if System.Web.Mvc.dll "<-- опять же, фальшивый </li>
  8. Запускай родинки.Я настоятельно рекомендую вам заглушить / кротить весь dll, потому что вы не захотите делать это снова.
  9. Удалите проверку пропуска: "sn -Vu System.Web.Mvc.dll" <--- поддельная </li>
  10. Восстановить реальную DLL: "gacutil -if System.Web.Mvc.dll" <--- <em>real one
  11. Удалить вашузлая фальшивая MVC dll, чтобы кто-то случайно не использовал ее.

System.Web.Mvc.Moles.dll, сгенерированный вами на шаге 8, будет ссылаться на реальную dll MVC, благодаря переключению открытого ключа, которое вы сделали.Вы можете использовать это, чтобы заглушить / моль классы MVC к душе.

0 голосов
/ 29 октября 2013

Чтобы добавить к тому, что упомянул @bhamlin, на шаге 2 мне также пришлось внести следующие изменения в AssemblyInfo.cs для генерации родинок:

Изменение

[assembly: AllowPartiallyTrustedCallers]

до

[assembly: AllowPartiallyTrustedCallers(PartialTrustVisibilityLevel = PartialTrustVisibilityLevel.NotVisibleByDefault)]

, как это определено в System.ComponentModel.DataAnnotations.dll

Производные типы должны либо соответствовать доступности безопасности базового типа, либо быть менее доступными

Базовый класс для CompareAttribute , который равен ValidationAttribute , находится в этой сборке.

0 голосов
/ 23 августа 2011

Вы можете попробовать исключить проблемные типы:

<Moles ...
   <StubGeneration ...
       <Types>
          <Remove TypeName="System.Web.Mvc.CompareAttribute" />
          <Remove TypeName="System.Web.Mvc.RemoteAttribute" />
       </Types>
   <MoleGeneration>
       <Types>
          <Remove TypeName="System.Web.Mvc.CompareAttribute" />
          <Remove TypeName="System.Web.Mvc.RemoteAttribute" />
       </Types>
   </MoleGeneration>
...