Доступ к недавно подписанной сторонней DLL дает ошибку
У меня есть подписанное приложение, которое использует сторонние библиотеки DLL. Эти библиотеки не были подписаны. - Пока что нет проблем для первого шага: я просто подписал их (получая *.il с помощью ildasm.exe, просто publickeytoken в *.il, потому что они имеют взаимозависимости, и сделал *.dll с ilasm.exe)
Проект теперь прекрасно компилируется и запускается.
Но когда в моем коде вызывается конструктор класса сторонней DLL-библиотеки (или что-то еще? - это было только первое, что я сделал), я получаю сообщение об ошибке "Сборки со строгим именем должны указывать открытый ключ в их InternalsVisibleTo декларации "
Кажется, не будет проблем, если у вас есть источник DLL и вы можете отрегулировать в AssemblyInfo.cs, установив
[assembly: InternalsVisibleTo("MyProject.Domain.Tests, PublicKey=..."]
Но: Как уже упоминалось выше, у меня есть сторонняя DLL, у меня нет исходного кода. Так что нет способа решить проблему, как эта.
Любые предложения, чтобы запустить это?
1 ответ
У меня была точно такая же проблема.
Почему так происходит
- Сторонняя сборка объявлена с
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
, вы должны исправить каждую декларацию с правильным открытым ключом.