Каков наилучший способ получить имя приложения (например, MyApplication.exe) исполняющей сборки из библиотеки классов ссылок в С#?
Мне нужно открыть приложение app.config для извлечения некоторых переменных appSettings для указанной DLL.
Каков наилучший способ получить имя приложения (например, MyApplication.exe) исполняющей сборки из библиотеки классов ссылок в С#?
Мне нужно открыть приложение app.config для извлечения некоторых переменных appSettings для указанной DLL.
Если вы хотите получить текущий файл конфигурации appdomain, тогда вам нужно всего лишь:
ConfigurationManager.AppSettings
....
(для этого требуется ссылка на System.Configuration, конечно).
Чтобы ответить на ваш вопрос, вы можете сделать это, как сказал Рэй (или используйте Assembly.GetExecutingAssembly().FullName
), но я думаю, что проблему проще решить с помощью ConfigurationManager
.
Чтобы получить ответ на заголовок вопроса:
// 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
.
Чтобы получить точное имя без версий и т.д., используйте:
string appName = Assembly.GetEntryAssembly().GetName().Name;
Работает с .NET v1.1 и более поздними версиями.
Вы можете получить сборку через тип класса...
typeof(MyClass).Assembly
Вы никогда не должны связывать свои библиотеки с потребителем (в данном случае 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);
}
}
Если вы хотите прочитать (и отобразить) номер версии:
Assembly ass = System.Reflection.Assembly.GetExecutingAssembly();
AssemblyName assname = ass.GetName();
Version ver=assname.Version;
Где-то в приложении (т.е. блок заголовка в форме Windows)
this.Text = "Your title Version " + ver;
Если вы хотите, чтобы имя родительского EXE, а не ссылка на DLL-сборку, вам нужно будет использовать это:
Assembly.GetEntryAssembly().GetName().Name
Это вернет имя EXE (минус часть .EXE).
Использование GetExecutingAssembly() неверно в соответствии с вопросом OP (первый абзац из этого!), поскольку он вернет имя DLL.
Для краткого имени сборки из экземпляра класса:
Me.GetType ().Assembly.GetName().Name