Assembly.LoadFrom — использование перегрузки Evidence для проверки подписи строгого имени.
-
03-07-2019 - |
Вопрос
Можно ли использовать перегрузку Assembly.LoadFrom с параметром Evidence, чтобы гарантировать строгое имя сборки?Я хочу иметь возможность указать имя сборки, культуру, версию и токен открытого ключа.Если какая-либо информация не соответствует, сборка не сможет загрузиться.
Решение 3
Я нашел другой способ сделать это.
var assemblyName = new AssemblyName(<fully qualified type name>);
assemblyName.CodeBase = <path to assembly>
Assembly.Load(assemblyName);
Другие советы
Вы можете получить открытый ключ сборки после ее загрузки — если она загружается успешно и имеет открытый ключ, то она имеет строгое имя:
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() возвращает значение, отличное от NULL, а затем сборка успешно загружается, значит, она имеет допустимое строгое имя.
У меня есть способ обойти проверку строгого имени для исправления System.Windows.Forms.dll.Если я им воспользуюсь, вы ничего не сможете с этим поделать.Мой трюк требует полного доверия.
Что я сделал, так это пропатчил dll, развернул исправленную dll, ngen ее и исправил загрузчик, чтобы получить исправленный образ ngen вместо оригинала.Что я мог сделать, так это уничтожить стандартную dll-библиотеку ngened.(Я действительно протестировал этот путь и решил, что возможность взлома чужого программного обеспечения — плохой выбор.)
Я не говорю, что это хорошая идея.Я говорю, что зависеть от проверки подписей от Assembly.Load — плохая идея.
Попробуйте System.ReflectionAssemblyNameFlags перечисление:
bool f_public_key = ((asm.GetName().Flags & AssemblyNameFlags.PublicKey) != 0);