Определение того, является ли сборка частью .NET framework

Как я могу определить по имени сборки или классу сборки (или подобному), является ли сборка частью структуры .СЕТЬ (то есть System.windows.Forms)?

До сих пор я рассматривал свойства PublicKeyToken и CodeBase, но они не всегда одинаковы для всего фреймворка.

Причина, по которой мне нужна эта информация, - получить список сборок, которые использует мой EXE-файл и которые должны находиться на клиентских машинах, чтобы я мог упаковать правильные файлы в установочный файл без использования системы установки Visual Studio. Проблема в том, что я не хочу забирать какие-либо сборки .NET framework, и я хочу, чтобы это был автоматический процесс, который легко развертывать после завершения крупного обновления.

Конечным решением было бы наличие свойства IsFramework ... :)

Насколько это должно быть автоматическим? Определить, какие из них от MS, довольно легко.

RQDQ 03.04.2012 20:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
18
1
3 306
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Я подозреваю, что самым надежным и наиболее общим методом будет PublicKeyToken. Да, их несколько, но это будет конечный список, который не очень часто меняется.

В этом отношении у вас может быть просто белый список имен сборок - этот список также будет конечным и статическим между версиями фреймворка.

Интересно, можете ли вы запросить токены открытого ключа в какой-нибудь службе Microsoft ... например, как они предоставляют удаленный сервер символов. Таким образом, вам не нужно отслеживать его вручную.

Anthony Mastrean 09.09.2008 19:33

Вы можете использовать отражение, чтобы посмотреть на издателя сборки и согласовать это с траекторией сборки. Если вы найдете сборку, издателем которой является Microsoft, и которая существует где-то ниже C:\Windows\Microsoft.NET\Framework, можно с уверенностью сказать, что она является частью среды выполнения.

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

Проблема здесь в том, что в GAC есть много вещей в соответствии с AssemblyName и Assembly.

Dave Arkell 09.09.2008 19:44

Нет, это не начинается с «Система». Вы можете проверить "WindowsBase", которая является сборкой фреймворка.

Вы также не можете проверить PublicKeyToken, потому что есть другие сборки Microsoft, подписанные ключами «по умолчанию», но они не являются частью .NET Framework (сборки Visual Studio).

Лучший способ сделать это - получить коллекцию установленных платформ .NET и проверить, является ли целевая сборка частью их RedistList (RedistList\FrameworkList.xml).

FrameworkList.xml можно найти в:

  • .NET 2.0: C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ RedistList
  • .NET 3.x: C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework \ vНомер версии \ RedistList
  • .NET 4.x: C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ vНомер версии \ RedistList
  • .NET Core: C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETCore \ vНомер версии \ RedistList

Требуется намного больше, чем +1. Это настоящий авторитетный ответ.

Joe White 29.11.2017 18:47

Если вы знаете, что ни одна из ваших DLL не будет в GAC, вы можете проверить, находится ли каждая сборка в GAC или нет. Если это так, не копируйте это. Если это не так, скопируйте его. В классе Assembly есть свойство GlobalAssemblyCache. Очевидно, что в одних ситуациях это сработает лучше, чем в других.

Для этого я использую имя продукта, встроенное в сборку через AssemblyProductAttribute.

var attribute = assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0] as AssemblyProductAttribute;
var isFrameworkAssembly = (attribute.Product == "Microsoft® .NET Framework");

Я использую эту технику для группировки сборок по продуктам на экране «О программе» приложения, и мне кажется, что она мне подходит.

Мне пришлось столкнуться с той же проблемой. К сожалению, все ответы, данные до сих пор, являются недостаточный, чтобы безопасно определить, является ли сборка частью .NET Framework.

Microsoft помещает класс с именем FXAssembly в глобальное пространство имен каждой сборки фреймворка с константной строкой, указывающей версию:

.class private abstract auto ansi sealed beforefieldinit FXAssembly
    extends [mscorlib]System.Object
{
    .field assembly static literal string Version = string('2.0.0.0')

}

Используйте этот «маркер», чтобы проверить, является ли сборка сборкой каркаса. Проверка открытого ключа тоже не помешает.

К сожалению, это не верно для всех сборок Framework :( Пример: System.Data версии 2.0.0.0 не имеет этого класса, хотя он был частью .net Framework 2.0. Проверка токена открытого ключа b77a5c561934e089 все еще кажется наиболее многообещающий

Michael Stum 21.04.2011 02:00

Помимо b77a5c561934e089, есть еще как минимум 3: 31bf3856ad364e35 (например, PresentationCore.dll), b03f5f7f11d50a3a (например, System.Drawing.dll) и 89845dcd8080cc91 (например, System.Data.SqlServerCe.dll)

VitalyB 03.11.2011 15:10

Когда вы устанавливаете Visual Studio, вы получаете эталонные сборки в различных подпапках в форме C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\{FrameworkName}\{FrameworkVersion} - наиболее интересным может быть файл RedistList\FrameworkList.xml, содержащий список всех имен сборок, поставляемых с данной версией фреймворка.

Например. C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\RedistList\FrameworkList.xml, кажется, содержит список всех сборок .NET 4.0 Framework.

Вы можете легко использовать эти файлы для создания статических белых списков сборок.

Другие вопросы по теме