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

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

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

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

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

Ответы [ 7 ]

4 голосов
/ 08 сентября 2010

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

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

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

}

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

4 голосов
/ 13 августа 2010

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

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

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

4 голосов
/ 15 апреля 2009

Нет, это не начинается с "Система". Вы можете проверить «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) \ Справочные сборки \ Microsoft \ Framework \ v Номер версии \ RedistList
  • .NET 4.x: C: \ Program Files (x86) \ Справочные сборки \ Microsoft \ Framework.NETFramework \ v Номер версии \ RedistList
  • .NET Core: C: \ Program Files (x86) \ Справочные сборки \ Microsoft \ Framework.NETCore \ v VersionNumber \ RedistList
3 голосов
/ 09 сентября 2008

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

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

1 голос
/ 28 января 2013

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

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

1 голос
/ 06 января 2010

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

1 голос
/ 09 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...