Вызов сборки для получения имени приложения

У меня есть консольное приложение (MyProgram.EXE), которое ссылается на сборку утилит.

В моей сборке утилит у меня есть код, который:

Dim asm As Assembly = Assembly.GetExecutingAssembly()
Dim location As String = asm.Location
Dim appName As String = System.IO.Path.GetDirectoryName(location)
Conole.WriteLine("AppName is: {0}", appName)

Когда я звоню с MyProgram.EXE, получаю "AppName is: Utilities.dll"

Я хочу "AppName is: MyProgram.EXE"

Что я делаю неправильно?


person Community    schedule 22.01.2009    source источник
comment
Вау, откуда взялись все эти br в моей редакции.   -  person Kev    schedule 22.01.2009


Ответы (4)


Вместо этого используйте GetEntryAssembly(), чтобы получить сборку, содержащую точку входа.

Лучше всего использовать свойство System.Environment.CommandLine.

Конкретно:

Dim location As String = System.Environment.GetCommandLineArgs()(0)
Dim appName As String = System.IO.Path.GetFileName(location)
Conole.WriteLine("AppName is: {0}", appName)

Кстати, вы хотите использовать GetFileName вместо GetDirectoryName

person mmx    schedule 22.01.2009
comment
Почему System.Environment.CommandLine лучше, чем GetEntryAssembly()? - person Billy Jo; 16.03.2011
comment
Потому что GetEntryAssembly () может возвращать null. См .: msdn.microsoft.com/en-us/ библиотека / - person Torben Koch Pløen; 02.10.2012
comment
также (согласно stackoverflow .com / questions / 980202 /): метод GetEntryAssembly также возвращает значение null, если вы запускаете приложение-службу WCF в режиме отладки под IIS. По общему признанию, это редкая ситуация, с которой может столкнуться только разработчик. - Gravitas 10 нояб. - person Abacus; 29.04.2013

Поскольку вы спрашивали о VB.NET, вы можете легко извлечь эту информацию из пространства имен My, как показано ниже:

My.Application.Info.AssemblyName
person atconway    schedule 19.07.2011
comment
Это также получит сборку указанной DLL, а не вызывающего (родительского) модуля. - person Abacus; 29.04.2013

Я использую:

CallingAppName = System.Reflection.Assembly.GetEntryAssembly.GetName().Name
person Stefano Hac    schedule 28.02.2020

В моем случае у меня не было доступа к My.Application, вероятно, потому, что я был в глобальном классе, поэтому я использовал:

AppName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
person Justin Tolchin    schedule 03.12.2018