2012-05-24 5 views
4

У меня есть подписанное приложение, которое использует сторонние DLL. Эти библиотеки DLL не были подписаны. - До сих пор нет проблем для первого шага: я только что подписал их (получая * .il с ildasm.exe, просто публиковал в * .il, потому что они имеют взаимозависимости и сделали * .dll с ilasm.exe)Доступ к недавно подписанной третьей стороне DLL дает ошибку

Проект теперь отлично компилируется и также запускается.

Но когда в моем коде вызывается конструктор классов из сторонней DLL (или что-то еще?), Я получаю сообщение об ошибке «Скрепленные подписью сборки должны указывать открытый ключ в своих заявлениях InternalsVisibleTo»

кажется, не будет проблемой, если у вас есть источник DLL и может изправлена ​​в AssemblyInfo.cs, установив

[assembly: InternalsVisibleTo("MyProject.Domain.Tests, PublicKey=..."] 

Но: Как упоминалось выше, у меня есть сторонняя DLL I нет есть источник. Поэтому нет способа решить эту проблему.

Любые предложения, связанные с этим?

ответ

9

У меня была такая же проблема.

Почему это происходит сборку

  • 3-й стороной объявлен с InternalsVisibleTo, чтобы сделать его «друг» в другие сборки, например, InternalsVisibleTo("OtherAssembly")
  • .NET требует, чтобы сборка сильного имени могла быть только «другом» для других сборок с сильными именами, и в этом случае атрибут InternalsVisibleTo должен указывать открытые ключи этих других сборок, например. InternalsVisibleTo("OtherAssembly, PublicKey=[key]")
  • Во время выполнения CLR видит, что InternalsVisibleTo не объявлен должным образом для рассматриваемой сборки, поэтому он выдает исключение.

Как исправить

Если узлы «друг» не нужны для выполнения программы (например, это сборка тест, который не развернут в производстве), выполните следующие действия:

  • Разобрать в вопросе: ildasm.exe ThirdParty.dll /OUTPUT=ThirdParty.il
  • Используйте текстовый редактор для редактирования файла IL, удалить любые заявления InternalsVisibleTo
  • Собрать и подписать IL: ilasm.exe ThirdParty.il /DLL /OUTPUT=ThirdParty.modified.dll /KEY=key.snk
  • Примечание: сгенерировать ключ по: sn.exe -k key.snk

Если узлы «друг», необходимых для выполнения программы, вы должны подписать все эти другу сборок. Затем выполните аналогичные шаги, как указано выше, за исключением того, что вместо удаления InternalsVisibleTo вы должны внести поправки в каждое объявление с помощью открытого ключа.

+0

Чтобы собрать и подписать IL, используйте ilasm.exe, а не ildasm.exe, который используется для разборки. –

+0

@ Xeno спасибо, это была опечатка, обновленная. –