Как я могу сильно подписать внешний DLL, сохраняя метаданные сборки?

StackOverflow https://stackoverflow.com/questions/3497455

  •  29-09-2019
  •  | 
  •  

Вопрос

У меня есть несколько библиотек, которые я использую в моем проекте, которые неподписаны. Поскольку мое приложение сильно подписывается, библиотеки должны быть также.

Я подписываю эти библиотеки, используя:

"%PROGRAMFILES%\Microsoft SDKs\Windows\v7.1\Bin\ildasm.exe" /nobar /all /out=library.il library.dll
"%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ilasm.exe" /dll /key=MyKey.snk library.il

Проблема в том, что любые метаданные, такие как номера версий, теряются в теперь подписанном DLL. Это проблема, потому что теперь некоторые зависимости между библиотеками нарушены. Как мне сохранить номера версий, не прибегая к фактическому составлению исходного кода этих библиотек?

ОБНОВИТЬ

На самом деле это конкретный DLL, который показывает эту проблему, и я обнаружил, что он построен с использованием Ilmerge. Возможно, это вызывает проблему. Просто чтобы быть ясным: DLL, который производится Ilmerge, имеет правильные метаданные, только после разборки и повторной сборки метаданные исчезают.

Обновление 2.

Я открыл DLL в отражателе, и кажется, что, по крайней мере, номер версии все еще там. Я все время проверял вкладку «Диалог" Свойства файла/детали "в Windows Explorer. Поэтому я полагаю, что вместо этого отсутствует манифест.

Это было полезно?

Решение

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

.assembly ConsoleApplication1
{
  //...
  .hash algorithm 0x00008004
  .ver 1:0:0:0
} 

Просто проверил снова, он «работает на моей машине» (используя то же самое командную коммутацию, как вы сделали).

Что на самом деле будет потеряно, это ФИЛЕВЕРСИЯ атрибут (тот, который вы видите в Windows Explorer при парении над сборкой. Собраниеверсия атрибут есть все еще присутствует и правильно. Анкет Может ли это быть, ты запутаешь два? Только AssemblyVersion важно для обязательной информации. Видеть это Так что пост для получения дополнительной информации.

Надеюсь, я смогу помочь, иначе вам нужно предоставить больше контекста.

Другие советы

Если у вас есть исходный код, то просто перекомпилируйте библиотеки с сильными именами - разборка и повторная сборка обычно работает довольно хорошо, но это все еще взлом.

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

Вы можете сделать это вручную, но это становится очень утомительным после 2 или 3 сборников. Быстрое решение для этого подписать, что касается многих трудностей, связанных с вами, и отлично справляется - обычно это довольно быстро и чисто.

(Обратите внимание, что в настоящее время он был построен против старой версии .NET. Если вы используете сборки C # 4 / .NET 4, вам нужно скачать источник, изменить его на цель .NET 4 и восстановить его, чтобы получить iGner.exe Это будет правильно обрабатывать .NET 4 сборки).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top