Можно ли использовать перегрузку Assembly.LoadFrom с параметром Evidence, чтобы обеспечить строгое имя сборки? Я хочу иметь возможность указать имя сборки, культуру, версию и токен открытого ключа. Если какая-либо из этих сведений не соответствует, сборка не должна загрузиться.
Вопрос
Assembly.LoadFrom - использование перегрузки Evidence для проверки подписи строгого имени
Ответы
Ответ 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.
Похожие материалы
- Можно ли отключить автоматическое создание экземпляров UnityContainer?
- Стилизация текущей страницы в меню ASP.NET
- Создать DateTime из строки без применения часового пояса или перехода на летнее время
- Microsoft Unity 2, как зарегистрировать следующее?
- Получение списка сборок, необходимых приложению
- Почему файлы DLL и EXE в контексте .NET называются сборками?