Получить имя исполняемой сборки из указанной DLL в C#

Как лучше всего получить имя приложения (например, MyApplication.exe) выполняющейся сборки из библиотеки классов, на которую указывает ссылка в C#?

Мне нужно открыть файл app.config приложения, чтобы получить некоторые переменные appSettings для указанной библиотеки DLL.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
39
0
63 675
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Чтобы получить ответ на заголовок вопроса:

// Full-name, e.g. MyApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
string exeAssembly = Assembly.GetEntryAssembly().FullName;

// or just the "assembly name" part (e.g. "MyApplication")
string exeAssemblyName = Assembly.GetEntryAssembly().GetName().Name;

Как упомянул @Ben, поскольку вы упомянули, что хотите получить информацию о конфигурации, используйте класс ConfigurationManager.

Для этого требуется использование System.Reflection?

Michael Kniskern 07.11.2008 20:26

Да, это в пространстве имен System.Reflection.

Judah Gabriel Himango 07.11.2008 20:29

Это было возвращено из этого вызова: MyApplication, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null

Michael Kniskern 07.11.2008 20:32

Чтобы узнать, какое пространство имен требуется, просто выберите в приведенном выше коде Assembly и нажмите Ctrl + Shift + F10 ...

Yordan Georgiev 28.05.2009 09:35

Это так мило с вашей стороны, что прошло около двух лет, и вы изменили свой ответ, включив в него мое решение. Почему так долго? :П

Aoi Karasu 29.03.2011 10:15
Assembly.GetEntryAssembly() возвращает null для веб-сайта ASP.net. Assembly.GetExecutingAssembly() что-то возвращает.
Ian Boyd 20.08.2013 17:40

AppDomain может быть приложением EXE, веб-приложением, приложением модульного тестирования, надстройкой Visual Studio и «приложением Silverlight» (?). Может быть интересное полное решение на все случаи жизни.

Kiquenet 26.03.2014 12:01

У меня есть Service.Host.dll и SvcImpl.dll (<% @ ServiceHost Service = "SvcImpl"%>) в IIS. Этот код в SvcImpl.dll: 1) Assembly.GetEntryAssembly () получает значение null. 2) Assembly.GetExecutingAssembly () получает SvcImpl. 3) Assembly.GetCallingAssembly (); получает System.ServiceModel. Как я могу получить Service.Host программно в SvcImpl, если Assembly.GetEntryAssembly () получает значение null?

Kiquenet 27.03.2014 18:32
Ответ принят как подходящий

Если вы хотите получить файл конфигурации текущего домена приложения, все, что вам нужно сделать, это:

ConfigurationManager.AppSettings ....

(это, конечно, требует ссылки на System.Configuration).

Чтобы ответить на ваш вопрос, вы можете сделать это, как сказал Рэй (или использовать Assembly.GetExecutingAssembly().FullName), но я думаю, что проблему легче решить с помощью ConfigurationManager.

Будет ли это решение работать с приложением asp.net? Библиотека классов, на которую указывает ссылка, может использоваться приложениями WinForms и ASP.NET.

Michael Kniskern 07.11.2008 20:29

да, в этом вся прелесть ConfigurationManager. Он выбирает тот файл app.config / web.config, который подходит для домена приложения. Это было введено в .NET 2.0.

Ben Scheirman 07.11.2008 20:50

Я только что провел тест с приложением asp.net и приложением WinFomrs, и он работал в обеих средах. В настоящее время я тестирую службу WCF. Это веб-сайт, с которым я столкнулся с проблемами.

Michael Kniskern 07.11.2008 20:58

Это dll, о которой вы говорите, в отдельном домене приложения?

Ben Scheirman 07.11.2008 21:52

Это работало для приложений ASP.NET и WinForms, но не работает для службы WCF.

Michael Kniskern 07.11.2008 21:52

@ Бен - Как мне это понять?

Michael Kniskern 07.11.2008 21:55
Assembly.GetExecutingAssembly() не получает сборку, которую ищет OP. Assembly.GetEntryAssembly() делает
quentin-starin 25.04.2011 19:34

У меня есть Service.Host.dll и SvcImpl.dll (<% @ ServiceHost Service = "SvcImpl"%>). Узел службы в IIS. Этот код в SvcImpl.dll: 1) Assembly.GetEntryAssembly () получает значение null. 2) Assembly.GetExecutingAssembly () получает SvcImpl. 3) Assembly.GetCallingAssembly (); получает System.ServiceModel. Как я могу получить Service.Host программно в SvcImpl, если Assembly.GetEntryAssembly () получает значение null?

Kiquenet 27.03.2014 18:30

Assembly.GetExecutingAssembly (). FullName не дает имени Application.exe

RJN 15.05.2020 11:02

Вы никогда не должны связывать свои библиотеки с потребителем (в данном случае с приложением Web, WinForm или WCF). Если вашей библиотеке требуются параметры конфигурации, ОТДАЙТЕ ее в библиотеку.

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

Если вы когда-нибудь смотрели на объект ConfigurationManager.AppSettings, это просто NameValueCollection. Итак, создайте конструктор в своей библиотеке, чтобы принять NameValueCollection, и пусть ваш потребитель ПОДАЕТ эти данные в библиотеку.

//Library
public class MyComponent
{
  //Constructor
  public MyComponent(NameValueCollection settings)
  {
     //do something with your settings now, like assign to a local collection
  }
}

//Consumer
class Program
{
  static void Main(string[] args)
  {
    MyComponent component = new MyComponent(ConfigurationManager.AppSettings);
  }
}

Чтобы получить точное имя без версий и т. д., Используйте:

string appName = Assembly.GetEntryAssembly().GetName().Name;

Работает с .NET v1.1 и новее.

Если A.exe использует B.dll, а B.dll использует C.dll, что произойдет, если этот код находится в C.dll?

Kiquenet 26.03.2014 11:58

По-прежнему возвращает A.exe, если A.exe не является неуправляемым или какие-либо библиотеки DLL загружены в отдельный домен приложений. Подробнее см .: msdn.microsoft.com/en-us/library/…

Aoi Karasu 26.03.2014 17:09

У меня есть Service.Host.dll и SvcImpl.dll (<% @ ServiceHost Service = "SvcImpl"%>) в IIS. Этот код в SvcImpl.dll: 1) Assembly.GetEntryAssembly () получает значение null. 2) Assembly.GetExecutingAssembly () получает SvcImpl. 3) Assembly.GetCallingAssembly (); получает System.ServiceModel. Как я могу получить Service.Host программно в SvcImpl, если Assembly.GetEntryAssembly () получает значение null?

Kiquenet 27.03.2014 18:40

Если вы хотите прочитать (и отобразить) номер версии:

  Assembly ass = System.Reflection.Assembly.GetExecutingAssembly();
  AssemblyName assname = ass.GetName();

  Version ver=assname.Version;

Где-то в приложении (например, основная надпись в форме Windows)

 this.Text = "Your title    Version " + ver;

Получить сборку можно через тип класса ...

typeof(MyClass).Assembly

Если вам нужно имя родительского EXE, а не ссылочной сборки DLL, вам нужно будет использовать это:

Assembly.GetEntryAssembly().GetName().Name

Это вернет имя EXE (без части .EXE).

Использование GetExecutingAssembly () неверно в соответствии с вопросом OP (его первый абзац!), Поскольку он вернет имя DLL.

Для краткого имени сборки из экземпляра класса:

Me.GetType ().Assembly.GetName().Name

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