Где значения хеша можно увидеть в манифесте для файла? - PullRequest
2 голосов
/ 03 марта 2012

Это цитата из CLR Джеффри Рихтера через C # book:

"Когда вы создаете сборку со строгим именем, таблица метаданных манифеста FileDef сборки включает в себя список всех файлов, которые составляютсборка. Когда имя каждого файла добавляется в манифест, содержимое файла хэшируется, и это значение хеш-функции сохраняется вместе с именем файла в таблице FileDef. "

Вопрос: Можете ли вы объяснить, хэширован ли каждый файл (насколько я понимаю, ссылаются на сборки + ресурсы) и хранится ли значение хеш-функции для каждого файла в MANIFEST, где / как я могу найти / увидеть эти значения хеш-функции в манифесте?* Когда я открываю манифест, я не могу найти его для образца сборки, который у меня есть.Я вижу информацию о сборке только в .assembly ConsoleTests {...}

1 Ответ

2 голосов
/ 03 марта 2012

По всем файлам, составляющим сборку , автор означает netmodule s, а не ссылочные сборки.

Если сборка состоит только из своего отдельного файла, FileDef таблица будет пустой.Вы сможете увидеть хеш-коды в манифесте, если попытаетесь создать сборку, состоящую из нескольких модулей.Попробуйте это:

(1) Создайте три исходных файла (для трех модулей):

// module1.cs
namespace MultiModuleAssembly
{
    public class Class1 { }
}

// module2.cs
namespace MultiModuleAssembly
{
    public class Class2 { }
}

// main.cs
namespace MultiModuleAssembly
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Class1 c1 = new Class1();
            Class2 c2 = new Class2();
        }
    }
}

(2) Скомпилируйте каждый файл в .netmodule:

csc /t:module module1.cs
csc /t:module module2.cs
csc /t:module main.cs /addmodule:module1.netmodule /addmodule:module2.netmodule

(3) Подпишите основной модуль с помощью ключа:

al main.netmodule /keyfile:key.snk /out:main-signed.dll

(4) Откройте main-signed.dll в ildasm и дважды щелкните узел M A N I F E S T:

// Somewhere in the middle of the listing
.file main.netmodule
    .hash = (89 84 FB F2 BB 72 AA 13 44 76 A5 49 8F 13 99 3E   // .....r..Dv.I...>
             54 30 24 84 )                                     // T0$.
...