AppDomain против System.Reflection при поиске имени и версии приложения - PullRequest
0 голосов
/ 06 апреля 2020

Пытаясь получить номер и имя версии .exe, я вижу, что мы можем использовать различные способы, такие как:

AppDomain.CurrentDomain.FriendlyName //shows: myapp.exe

или использовать

System.Reflection.Assembly.GetExecutingAssembly().GetName().Name //shows myapp

Оба класса производят "почти : то же имя, но мой вопрос:

В чем разница между этими двумя? Зачем использовать один над другим (забыть производительность)?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

Сборка - это более физическая вещь (если можно так сказать), в то время как App Domain полностью находится в памяти. Домен приложения - это то, где ваше приложение в основном запускается и взаимодействует с каркасом, и в нем есть несколько загруженных сборок. Если ваша основная сборка окажется загрузочной сборкой в ​​домене приложения, вы можете получить одно и то же имя для сборки и домена. В вашем конкретном случае вы запустили приложение с exe, а ваш текущий домен - app.exe. Но это не имя сборки, которое не имеет расширения файла. Сборка имеет свою версию против версии файла. Они могут совпадать или нет. Если у вас есть компоненты приложения, вы можете поместить их в любой из них Assembly.GetCurrentAssembly(), и он вернет вам что-то еще. Но главное, AppDomain <> Assembly. Это 2 разных зверя.

«Зачем использовать один над другим (забыть о производительности)?» Зависит от того, что вы пытаетесь сделать. Вы используете обе вещи каждый раз, когда приложение работает. Но если ваша цель - просто получить информацию о приложении, такую ​​как имя, версия файла, версия сборки - используйте сборку

1 голос
/ 06 апреля 2020

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

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

Примечание: Json сериализация используется здесь только для того, чтобы показать, какая информация доступна через класс FileVersionInfo.

string executablePath = new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath;
FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(executablePath);

Console.WriteLine(JsonConvert.SerializeObject(fileVersionInfo, Newtonsoft.Json.Formatting.Indented));

Вывод для моего очень простого консольного приложения выглядит следующим образом:

{
  "Comments": "",
  "CompanyName": "",
  "FileBuildPart": 0,
  "FileDescription": "ConsoleApplication1",
  "FileMajorPart": 2,
  "FileMinorPart": 1,
  "FileName": "C:\\Projects\\.....\\ConsoleApplication1.exe",
  "FilePrivatePart": 0,
  "FileVersion": "2.1.0.0",
  "InternalName": "ConsoleApplication1.exe",
  "IsDebug": false,
  "IsPatched": false,
  "IsPrivateBuild": false,
  "IsPreRelease": false,
  "IsSpecialBuild": false,
  "Language": "Language Neutral",
  "LegalCopyright": "Copyright ©  2019",
  "LegalTrademarks": "",
  "OriginalFilename": "ConsoleApplication1.exe",
  "PrivateBuild": "",
  "ProductBuildPart": 0,
  "ProductMajorPart": 2,
  "ProductMinorPart": 1,
  "ProductName": "ConsoleApplication1",
  "ProductPrivatePart": 0,
  "ProductVersion": "2.1.0.0",
  "SpecialBuild": ""
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...