




Чтобы получить ответ на заголовок вопроса:
// 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.
Это было возвращено из этого вызова: MyApplication, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null
Чтобы узнать, какое пространство имен требуется, просто выберите в приведенном выше коде Assembly и нажмите Ctrl + Shift + F10 ...
Это так мило с вашей стороны, что прошло около двух лет, и вы изменили свой ответ, включив в него мое решение. Почему так долго? :П
Assembly.GetEntryAssembly() возвращает null для веб-сайта ASP.net. Assembly.GetExecutingAssembly() что-то возвращает.
AppDomain может быть приложением EXE, веб-приложением, приложением модульного тестирования, надстройкой Visual Studio и «приложением Silverlight» (?). Может быть интересное полное решение на все случаи жизни.
У меня есть 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?
Если вы хотите получить файл конфигурации текущего домена приложения, все, что вам нужно сделать, это:
ConfigurationManager.AppSettings ....
(это, конечно, требует ссылки на System.Configuration).
Чтобы ответить на ваш вопрос, вы можете сделать это, как сказал Рэй (или использовать Assembly.GetExecutingAssembly().FullName), но я думаю, что проблему легче решить с помощью ConfigurationManager.
Будет ли это решение работать с приложением asp.net? Библиотека классов, на которую указывает ссылка, может использоваться приложениями WinForms и ASP.NET.
да, в этом вся прелесть ConfigurationManager. Он выбирает тот файл app.config / web.config, который подходит для домена приложения. Это было введено в .NET 2.0.
Я только что провел тест с приложением asp.net и приложением WinFomrs, и он работал в обеих средах. В настоящее время я тестирую службу WCF. Это веб-сайт, с которым я столкнулся с проблемами.
Это dll, о которой вы говорите, в отдельном домене приложения?
Это работало для приложений ASP.NET и WinForms, но не работает для службы WCF.
@ Бен - Как мне это понять?
Assembly.GetExecutingAssembly() не получает сборку, которую ищет OP. Assembly.GetEntryAssembly() делает
У меня есть 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?
Assembly.GetExecutingAssembly (). FullName не дает имени Application.exe
Вы никогда не должны связывать свои библиотеки с потребителем (в данном случае с приложением 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?
По-прежнему возвращает A.exe, если A.exe не является неуправляемым или какие-либо библиотеки DLL загружены в отдельный домен приложений. Подробнее см .: msdn.microsoft.com/en-us/library/…
У меня есть 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?
Если вы хотите прочитать (и отобразить) номер версии:
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
Для этого требуется использование System.Reflection?