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

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

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

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

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


person Dave Arkell    schedule 09.09.2008    source источник
comment
Насколько это должно быть автоматически? Довольно легко выбрать, какие из них от MS.   -  person RQDQ    schedule 03.04.2012


Ответы (7)


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

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

person Curt Hagenlocher    schedule 09.09.2008
comment
Интересно, можете ли вы запросить у какой-нибудь службы Microsoft токены открытого ключа... например, как они предоставляют удаленный сервер символов. Таким образом, вам не придется отслеживать его вручную. - person Anthony Mastrean; 09.09.2008

Нет, оно не начинается с «Система». Вы можете проверить «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
person Community    schedule 14.04.2009
comment
Нужно намного больше, чем +1. Это настоящий, авторитетный ответ. - person Joe White; 29.11.2017

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

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

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

person jpierson    schedule 12.08.2010

Мне приходилось иметь дело с точно такой же проблемой. К сожалению, все ответы, данные до сих пор, недостаточны для безопасного определения того, является ли сборка частью .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')

}

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

person Johannes Rudolph    schedule 08.09.2010
comment
К сожалению, это верно не для всех сборок Framework :( Пример: System.Data Version 2.0.0.0 не имеет этого класса, хотя он был частью .net Framework 2.0. Проверка маркера открытого ключа b77a5c561934e089 по-прежнему кажется самый многообещающий - person Michael Stum; 21.04.2011
comment
Помимо b77a5c561934e089 есть еще как минимум 3: 31bf3856ad364e35 (например, PresentationCore.dll), b03f5f7f11d50a3a (например, System.Drawing.dll) и 89845dcd8080cc91 (например, System.Data.SqlServerCe.dll) - person VitalyB; 03.11.2011

Когда вы устанавливаете 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.

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

person Jean Hominal    schedule 28.01.2013

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

person Jon Turner    schedule 06.01.2010

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

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

person TheSmurf    schedule 09.09.2008
comment
Проблема здесь в том, что в GAC есть много вещей в соответствии с AssemblyName и Assembly. - person Dave Arkell; 09.09.2008