Как я могу отредактировать поле «Открытый ключ или токен» манифеста, встроенного в файл DLL или EXE? - PullRequest
0 голосов
/ 23 августа 2010

Я пытаюсь решить следующую проблему: [.Net 2.0, CLR 2.5.something, 64-битный компьютер, все DLL и EXE-файлы выглядят скомпилированными для «любого процессора» в соответствии с corflags]

Я поддерживаюустаревшее приложение, которое использует стороннюю DLL.Совершенно неожиданно (насколько я могу судить) функциональность, зависящая от DLL, перестала работать на одной из машин, на которых она развернута, со следующей ошибкой:

Не удалось загрузить файл или сборку 'Interop.Merge70, версия = 7.0.0.0, культура = нейтральная, PublicKeyToken = null 'или одна из ее зависимостей.Определение манифеста обнаруженной сборки не совпадает со ссылкой на сборку.

Я просмотрел манифест DLL, а также AssemblyRef (использованный инструмент ildasm) в исполняемом файле приложения и единственном экземпляре.Разница, которую я мог бы найти, состоит в том, что DLL строго подписана (?), но согласно AssemblyRef DLL не подписана.Теперь, оставив в стороне тот факт, что если это проблема - как это работало до сих пор?(поскольку у меня есть только слово пользователя для этого ;-))

Как я могу отредактировать манифест приложения, чтобы изменить AssemblyRef для подписи его открытым ключом, как это указано в манифесте DLL? (Также, как ни странно, у меня нет кода для устаревшей версии, я в идеале ищу как решение для exe-редактирования, так и кое-что для VS2008 для текущей версии приложения)

Обновление выясняется, что в текущей версии, в которой у меня есть код, поле "ключ или токен" в коде, в котором используется сторонняя программа, содержит правильный токен, извлеченный из "sn -"Tp 3rdparty.dll ".. но при запуске выдается такая же ошибка ... Чего мне здесь не хватает?

Ответы [ 3 ]

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

Если у вас нет источника, то вы можете сделать это с помощью ILDASM, за которым следует ILASM: на шаге ILASM укажите нужный закрытый ключ.

Однако предполагается, что у вас есть закрытый ключ, который соответствуетна токен открытого ключа вы хотите дать двоичный файл.Если этого не хватает (что, я полагаю, так и есть, если исходный код исчез), вам нужно будет выбрать другой закрытый ключ для подписи.

Если вы измените закрытые ключи, вам также потребуетсяперекомпилируйте любой код, который ссылается на сборку, потому что, изменив закрытый ключ, вы измените токен открытого ключа (и в итоге получите исходную ошибку).

Редактировать:"Что такоеЯ здесь скучаю? "- Вы уверены, что правильный двоичный файл используется во время выполнения?Если вы включите ведение журнала через fuslogvw.exe, вы должны получить более подробное исключение.

0 голосов
/ 24 августа 2010

Следующее решило проблему:

в текущей версии я добавил DLL в соответствии с рекомендациями производителя, которая является библиотекой Com +, а не автономной DLL.Это сделало текущую версию функциональной.Затем я взял стороннюю DLL, которая была скопирована как часть сборки, и поместил ее вместо DLL в прежнюю версию.Проблема решена .... Спасибо всем за полезные ответы и ссылки на полезные инструменты.Я уверен, что немного узнал об устранении неполадок:)

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

Вы должны перекомпилировать библиотеку и подписать ее во время компиляции или использовать задержку подписи (но я никогда не использовал это).

Судя по всему, это сгенерированная TLBEXP библиотека, которая исключает опции для подписи кода.

Если у вас нет оригинального ключа, вам придется отказаться от всех своих сборок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...