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