Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Assembly.LoadFrom - использование перегрузки Evidence для проверки подписи строгого имени

Автор вопроса: user38309Ответов: 4

Можно ли использовать перегрузку Assembly.LoadFrom с параметром Evidence, чтобы обеспечить строгое имя сборки? Я хочу иметь возможность указать имя сборки, культуру, версию и токен открытого ключа. Если какая-либо из этих сведений не соответствует, сборка не должна загрузиться.

assemblies

Ответы

Ответ 1 · рейтинг 4 · Joe Albahari

Вы можете получить открытый ключ сборки после ее загрузки - если она загружается успешно и имеет открытый ключ, то она имеет строгое имя:

Assembly assembly = Assembly.LoadFrom (...);
byte[] pk = assembly.GetName().GetPublicKey();

Еще лучше, проверьте открытый ключ сборки и информацию о версии перед загрузкой:

AssemblyName an = AssemblyName.GetAssemblyName ("myfile.exe");
byte[] publicKey = an.GetPublicKey();
CultureInfo culture = an.CultureInfo;
Version version = an.Version;

Если GetPublicKey () возвращает ненулевое значение, а затем сборка успешно загружается, у нее есть допустимое строгое имя.

Ответ 2 · рейтинг 1 · Joshua

У меня есть способ нарушить проверку строгого имени для исправления System.Windows.Forms.dll. Если я использую его, вы ничего не можете с этим поделать. Моя уловка требует полного доверия.

Что я сделал, так это пропатчил dll, развернул исправленную dll, ngen ее и исправил загрузчик, чтобы забрать исправленный образ ngen вместо оригинала. Что я мог сделать, так это затереть стандартную dll ngened. (Я действительно проверил этот путь и решил, что потенциально взломать чужое программное обеспечение - плохой выбор.)

Я не говорю, что это хорошая идея. Я говорю, что проверять подписи из Assembly.Load - плохая идея.

Ответ 3 · user38309

Я нашел другой способ сделать это.

var assemblyName = new AssemblyName(<fully qualified type name>);
assemblyName.CodeBase = <path to assembly>

Assembly.Load(assemblyName);

Ответ 4 · Glenn Slayden

Попробуйте перечисление System.ReflectionAssemblyNameFlags:

bool f_public_key = ((asm.GetName().Flags & AssemblyNameFlags.PublicKey) != 0);

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы