Определение, является ли сборка частью платформы .NET
Как я могу указать имя сборки или класс сборки (или другие подобные ей), является ли сборка частью .NET (т.е. System.windows.Forms
)?
До сих пор я рассматривал свойства PublicKeyToken и CodeBase, но они не всегда одинаковы для всей структуры.
Причина, по которой я хочу эту информацию, - получить список сборок, которые использует мой EXE файл, которые должны быть на клиентских компьютерах, поэтому я могу упаковать правильные файлы в установочный файл без использования системы установки Visual Studio. Проблема в том, что я не хочу собирать какие-либо сборки .NET framework, и я хочу, чтобы это был автоматический процесс, который легко развертывать всякий раз, когда основное обновление завершено.
Конечным решением было бы то, что есть свойство IsFramework...:)
Ответы
Ответ 1
Я подозреваю, что метод, который является самым надежным и наиболее общим, будет PublicKeyToken. Да, там более одного, но это будет конечный список и тот, который не меняется очень часто.
В этом случае вы можете просто иметь белый список имен сборки - этот список также будет конечным и статическим между версиями фреймворка.
Ответ 2
Мне пришлось иметь дело с тем же вопросом. К сожалению, все приведенные до сих пор ответы недостаточно, чтобы безопасно определить, является ли сборка частью .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')
}
Используйте этот "маркер", чтобы проверить, является ли сборка сборкой фреймов. Проверка открытого ключа тоже не повредит.
Ответ 3
Для этого я использую имя продукта, встроенное в сборку, через AssemblyProductAttribute.
var attribute = assembly.GetCustomAttributes(typeof(AssemblyProductAttribute), false)[0] as AssemblyProductAttribute;
var isFrameworkAssembly = (attribute.Product == "Microsoft® .NET Framework");
Я использую этот метод для группировки сборок по продукту на экране "О программе" приложения, и, похоже, для меня это отлично работает.
Ответ 4
Нет, это не начинается с "System". Вы можете проверить "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\vVersionNumber\RedistList
- .NET 4.x: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\vVersionNumber\RedistList
- .NET Core: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\vVersionNumber\RedistList
Ответ 5
Вы можете использовать отражение, чтобы посмотреть издателя сборки, и скоординировать это с контуром сборки. Если вы обнаружите сборку, издателем которой является Microsoft, и которая существует где-то ниже C:\Windows\Microsoft.NET\Framework
, это безопасно делает ее частью среды выполнения.
С другой стороны, издатель, возможно, даже не нужен. Все, что находится под этим путем, должно быть частью среды выполнения (запрет неправильного использования приложения, которое не должно быть).
Ответ 6
Если вы знаете, что ни одна из ваших библиотек DLL не будет в GAC, вы можете проверить, есть ли каждая сборка в GAC или нет. Если это так, не копируйте его. Если это не так, то скопируйте его. В классе Assembly, называемом GlobalAssemblyCache, есть свойство. Это, очевидно, будет работать лучше в некоторых ситуациях, чем в других.
Ответ 7
Когда вы устанавливаете 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.
Вы можете легко использовать эти файлы для установки статических белых списков сборок.