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

StackOverflow https://stackoverflow.com/questions/52134

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Для этого я использую имя продукта, встроенное в сборку через атрибут 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')

}

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

Нет, оно не начинается с «Система».Вы можете проверить «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 edistList
  • .NET 3.x:C:\Program Files (x86) eference Assemblies\Microsoft\Framework\vНомер версии edistList
  • .NET 4.x:C:\Program Files (x86) eference Assemblies\Microsoft\Framework.NETFramework\vНомер версии edistList
  • .NET ядро:C:\Program Files (x86) eference Assemblies\Microsoft\Framework.NETCore\vНомер версии edistList

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

При установке 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.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top