C#で現在の実行可能ファイルの名前を取得するにはどうすればよいですか?


355

現在実行中のプログラムの名前、つまりプログラムの実行可能名を取得したい。C / C ++ではから取得しargs[0]ます。


実行可能ファイルはEXEファイル(Windowsフォーム、WPFアプリケーション)ですか?プログラムには、デスクトップアプリ(WinForms、WPF、WinRT-Windows Phone?)、Webアプリケーション、Wcfサービスアプリケーション、Visual Studioアドイン、Outlook-Wordアドイン、VS(MSTest)の単体テスト、またはSilverlightアプリケーションがあります。
キケネット2014年

回答:


405
System.AppDomain.CurrentDomain.FriendlyName

61
受け入れられた答えに注意してください。System.AppDomain.CurrentDomain.FriendlyNameClick-Onceでデプロイされたアプリケーションの使用に問題がありました。私たちにとって、これは元のexe名ではなく、「DefaultDomain」を返します。
Gaspode 2010

40
最後にこれを使用しました:string file = object_of_type_in_application_assembly.GetType().Assembly.Location; string app = System.IO.Path.GetFileNameWithoutExtension( file );
Gaspode

4
FriendlyNameは任意に設定できます。また、複数のdllを持つexeがある場合、アセンブリの場所を取得するだけでは不十分な場合があります。さらに、複数のAppDomainを使用する場合、Assembly.GetCallingAssembly()はnullを返します。
user276648

2
@Gaspode:Path.GetFileNameWithoutExtension(GetType()。Assembly.Location)と言うだけの方が簡単です。現在のアセンブリで型のオブジェクトを指定する必要はありません。これのGetTypeを使用でき、「これ」と言う必要さえありません。
vbullinger 2012

4
これは便利かもしれませが、受け入れられる答えではありません。要求されたものとは大きく異なります。ある状況では偶然同じものになりますが、これはまったく別の問題です。アプリケーションを自分で作成しなかった場合、「ポテトが好きです!」または、ユーモラスな同僚がアプリケーションを構築したときにこのプロパティに書き込んだものは何ですか。
AnorZaken

237

System.AppDomain.CurrentDomain.FriendlyName -拡張子付きのファイル名を返します(例:MyApp.exe)。

System.Diagnostics.Process.GetCurrentProcess().ProcessName-拡張子なしのファイル名返します(例:MyApp)。

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName-フルパスとファイル名を返します(例:C:\ Examples \ Processes \ MyApp.exe)。次に、これを渡すSystem.IO.Path.GetFileName()System.IO.Path.GetFileNameWithoutExtension()、上記と同じ結果を得ることができます。


3
AppDomainは、EXEアプリケーション、Webアプリケーション、単体テストアプリケーション、アドインVisual Studio、および「Silverlight App」(?)にすることができます。おそらく、すべてのケースで興味深い完全なソリューションです。たとえば、ユニットテストの場合VS2012-ProcessName:vstest.executionengine.x86 MainModule.FileName:C:\ PROGRAM FILES(X86)\ MICROSOFT VISUAL STUDIO 11.0 \ COMMON7 \ IDE \ COMMONEXTENSIONS \ MICROSOFT \ TESTWINDOW \ vstest.executionengine.x86.exe MainModule.ModuleName:vstest.executionengine.x86.exe FriendlyName:UnitTestAdapter:Running test ApplicationName:
Kiquenet

「プログラム」は、デスクトップアプリ(WinForms、WPF、およびWinRT-Windows Phone?)、Webアプリケーション、Wcfサービスアプリケーション、Visual Studioアドイン、Outlook-Wordアドイン、VS(MSTest)の単体テスト、またはSilverlightアプリケーションです。 。たとえば、IISExpressまたはWebDevServerではなくIISでホストされているWcfサービスアプリケーションのサービスホストアセンブリを取得するにはどうすればよいですか。
キケネット2014年

6
+1この答えを使用します。クリーンでシンプルな方法で必要になる可能性のある3つのバリエーションすべてを提供するためです。パスや拡張子なしで裸のプログラム名を使用すると、プログラム内のヘルプテキスト(/?スイッチ)に非常に役立ちます。これは、拡張子とパスを使用すると、不必要に混乱するためです。
Synetech 2014

2
結果をGetCurrentProcess()
破棄

Process.GetCurrentProcess().ProcessName()MyApp.vshostを返します。
ジョナサンウッド

106

System.Diagnostics.Process.GetCurrentProcess()現在実行中のプロセスを取得します。ProcessNameプロパティを使用して、名前を把握できます。以下はコンソールアプリのサンプルです。

using System;
using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Process.GetCurrentProcess().ProcessName);
        Console.ReadLine();
    }
}

36
Process.GetCurrentProcess()。MainModule.FileNameを使用することをお勧めします
KindDragon

Process.GetCurrentProcess()。MainModule.FileNameは、Excelアドイン(ExcelDNA)内から完全に機能します
earcam

10
このアプローチは、Monoランタイムで使用すると失敗します。Monoで実行されているアプリケーションのプロセス名は、常に.../bin/mono* nixesまたは.../mono.exeWindowsのバリアントになります。
cdhowie 2012年

1
これは受け入れられる答えになるはずです。現在のAppDomain名は、特に複数のアプリドメインが存在する場合、実行可能プロセス名とは関係がない可能性があります
Ivan Krivyakov

このメソッドは、Assemblyクラスを操作するよりも大幅に遅くなる可能性があります。
Erwin Mayer

99

これで十分です:

Environment.GetCommandLineArgs()[0];

3
うーん、これは(vs.netから実行し、デバッグホスティングを使用して)、filename.vshost.exeの場所と名前を返します...これは実際にこの時点で実行されているファイルです)
Frederik Gheysels

13
これは私にとって最良の答えです。なぜならC / C ++からのEnvironment.GetCommandLineArgs()正確なC#の類似物だargvからです。
Frederick The Fool

同意しました!ベストアンサー。Environment.GetCommandLineArgs()[1]を取得する必要があります。
Jerry Liang

1
フルパスを回避するには:Path.GetFileNameWithoutExtension(Environment.GetCommandLineArgs()[0])
Nathan

1
これは、WCFサービスを追跡するときにうまく機能します。私の場合、プロセス名はiisexpressで返されます。しかし、このコマンドにより、実際のWCFサービスアセンブリ名がわかります。
P.Brian.Mackey 2018年

19

これは私のために働いたコードです:

string fullName = Assembly.GetEntryAssembly().Location;
string myName = Path.GetFileNameWithoutExtension(fullName);

上記のすべての例では、vshostまたは実行中のdll名を含むprocessNameを取得しています。


4
知らない、または他の回答で見逃した人のために、アセンブリの名前空間はSystem.Reflectionであり、パスの名前空間はSystem.IOです。
アマルガメート2015

4
アプリケーションのエントリポイントがアセンブリではなくネイティブコードにある場合、GetEntryAssemblyはnullを返します。
Emdot 2015

18

これを試して:

System.Reflection.Assembly.GetExecutingAssembly()

これによりSystem.Reflection.Assembly、現在のアプリケーションについて知りたいすべてのデータを含むインスタンスが返されます。Location物件は具体的にはあなたが欲しいものを手に入れるかもしれないと思います。


6
.NETのシャドウコピー機能がアクティブな場合CodeBaseLocation、代わりに使用した方が安全な場合があります。blogs.msdn.com/suzcook/archive/2003/06/26/…を
Dirk Vollmar 2009

18
GetExecutingAssembly()に注意してください:これをライブラリアセンブリから呼び出すと、エントリアセンブリ(つまり、元の実行可能ファイル)の名前とは異なるライブラリアセンブリの名前が返されます。GetEntryAssembly()を使用すると、実際の実行可能ファイルの名前が返されますが、プロセスがWCFで実行されている場合は例外がスローされます(確かにまれな状況です)。最も堅牢なコードには、Process.GetCurrentProcess()。ProcessNameを使用します。
Contango 2010年

@Gravitas:確かにそうではありません。たとえば、/ usr / bin / monoなどで「解釈」されて実行されている実行可能ファイルは、間違ったプロセス名を持ちます。また、ProcessNameはWindowsサービスでは機能しません。ライブラリで使用する場合は、GetCallingAssemblyを使用してください。
Stefan Steiger 2013年

1
私のために働いた。返されるAssemblyインスタンスのGetName()呼び出しのプロパティNameは必要なものであり、「。exe」部分は含まれていません。Mono / Linuxでもテストされ、期待される結果が得られました。Assembly.GetName()。Name
Hansou Hatoru、2014年

1
ファイルエクスプローラーを使用して実行可能ファイルの名前を手動で変更しても、返される文字列は変更されないことに注意してください。一方、Environment.GetCommandLineArgs()[0]は、実際の実行可能ファイル名(もちろん)とともに変化します。偶然にも、データフォルダーに実際の実行可能ファイル名を付けたいので、2番目の方法の方が私の特定の状況に適しています。
Hansou Hatoru、2014年

11
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name;

あなたのようなアプリのFileNameを与えます; 「MyApplication.exe」


11

なぜだれもこれを提案しなかったのは簡単です。

Path.GetFileName(Application.ExecutablePath)

3
アプリケーションが存在する名前空間。
Jeetendra

6
これは、Windowsフォームアプリ内で役立ちますが、それ以外の場合は役に立ちません
NineBerry

@NineBerry Application.ExecutablePathソースコードに興味があるかもしれません。
不気味な

@NineBerry私の投稿を参照してください。System.Windows.Formsへの参照を追加すると、これはコンソールアプリ内で機能します。
John


9

ファイアウォールルールを設定するためにプログラム名が必要な場合は、以下を使用します。

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName

これにより、VisualStudioでデバッグするときと、ウィンドウで直接アプリを実行するときの両方で、名前が正しいことが保証されます。


2
私の目的(ロギングファイル名の作成)では、これが最良の答えです。ホストされたプロセス(サービス、Webアプリケーションなど)を実行している場合、System.AppDomain.CurrentDomain.FriendlyNameは、スラッシュが埋め込まれた醜いGUID-y名を返す可能性があります。
カート

8

確信が持てない場合や疑問がある場合は、輪になって走り、叫び、叫びます。

class Ourself
{
    public static string OurFileName() {
        System.Reflection.Assembly _objParentAssembly;

        if (System.Reflection.Assembly.GetEntryAssembly() == null)
            _objParentAssembly = System.Reflection.Assembly.GetCallingAssembly();
        else
            _objParentAssembly = System.Reflection.Assembly.GetEntryAssembly();

        if (_objParentAssembly.CodeBase.StartsWith("http://"))
            throw new System.IO.IOException("Deployed from URL");

        if (System.IO.File.Exists(_objParentAssembly.Location))
            return _objParentAssembly.Location;
        if (System.IO.File.Exists(System.AppDomain.CurrentDomain.BaseDirectory + System.AppDomain.CurrentDomain.FriendlyName))
            return System.AppDomain.CurrentDomain.BaseDirectory + System.AppDomain.CurrentDomain.FriendlyName;
        if (System.IO.File.Exists(System.Reflection.Assembly.GetExecutingAssembly().Location))
            return System.Reflection.Assembly.GetExecutingAssembly().Location;

        throw new System.IO.IOException("Assembly not found");
    }
}

私は各オプションをテストしたと主張することはできませんが、デバッグセッション中に仮想ホストを返すような愚かなことは何もしません。


2
娯楽のための+1。:-)ただし、このコードを使用することはほとんどありませんが、その環境について何も知らない本当に一般的なライブラリを作成しているのでない限り(そして、使用するグローバル状態を維持することはおそらくお勧めできません)の名前)。
Andrey Tarantsov 2013年

@Orwellophile「プログラム」は、デスクトップアプリ(WinForms、WPF、およびWinRT-Windows Phone?)、Webアプリケーション、Wcfサービスアプリケーション、Visual Studioアドイン、Outlook-Wordアドイン、VS(MSTest)での単体テスト、または、 Silverlightアプリケーション。たとえば、IISExpressまたはWebDevServerではなくIISでホストされているWcfサービスアプリケーションのサービスホストアセンブリを取得するにはどうすればよいですか。WinForms、WPF、Webアプリケーション、Wcfサービスアプリケーション、Visual Studioアドイン、Outlook-Wordアドイン、VS(MSTest)アプリケーションでの単体テストに有効な完全なコードはありますか?
キケネット2014年

8
  • System.Reflection.Assembly.GetEntryAssembly().Location アセンブリがメモリから読み込まれていない場合は、exe名の場所を返します。
  • System.Reflection.Assembly.GetEntryAssembly().CodeBase 場所をURLとして返します。

テスト済み。C#ライブラリ内から呼び出された場合でも、これは100%機能します。
Contango 2010年

1
メインのAppDomainにいない場合、GetEntryAssembly()はnullを返します。
user276648

4

実行可能ファイルの完全パス情報を探している場合、信頼できる方法は次を使用することです:

   var executable = System.Diagnostics.Process.GetCurrentProcess().MainModule
                       .FileName.Replace(".vshost", "");

これにより、中間dll、vshostなどの問題がなくなります。


Ubuntu Linux 15.10 C ++でrealpathに続いてSTL C ++文字列置換を使用して信頼できる方法を試しましたが、ポイントアンドクリックが失敗しました。今日のソフトウェアディレクターが推測したモノのバグが原因でしたか?ありがとう。
フランク

試すのも楽しいかもしれませんが、私は、モノにプログラムしません
theMayer

Gaspondeは、「Click-OnceでデプロイされたアプリケーションでのSystem.AppDomain.CurrentDomain.FriendlyNameの使用に問題があった」と述べています。.NETに配置されたClick-Onceアプリケーションで問題が発生する可能性があることについて推測できますか?ありがとう。
フランク

VS2017のサンプルプログラムのC:\ Program Files \ dotnet \ dotnet.exeを返します。
jwdonahue

3

を使用Environment.GetCommandLineArgs()して、引数Environment.CommandLineを取得したり、入力したとおりに実際のコマンドラインを取得したりできます。

また、Assembly.GetEntryAssembly()またはを使用できますProcess.GetCurrentProcess()

ただし、デバッグするときは、他の例と同様に、この最後の例では実行可能ファイルではなくデバッガの実行可能ファイルの名前(デバッガの接続方法によって異なる)が表示される可能性があるため、注意が必要です。


4
GetExecutingAssembly()に注意してください。これをライブラリアセンブリから呼び出すと、エントリアセンブリ(つまり、元の実行可能ファイル)の名前とは異なるライブラリアセンブリの名前が返されます。GetEntryAssembly()を使用すると、実際の実行可能ファイルの名前が返されますが、プロセスがWCFで実行されている場合は例外がスローされます(確かにまれな状況です)。最も堅牢なコードには、Process.GetCurrentProcess()。ProcessNameを使用します。
Contango 2010年

@Gravitas:良い点-うわー、私がこれを書いてからしばらく経ちました!:D私はそれに応じて編集します
Jeff Yates

Environment.CommandLine少なくともMono / Linuxでは、入力されたコマンドラインではなく、絶対パスを指定します。
機械式カタツムリ

@Mechanicalsnail:Monoのように聞こえますが、ドキュメントに完全に従っていません。面白い。
Jeff Yates

1

これは、あなたの望むことですか:

Assembly.GetExecutingAssembly ().Location

4
GetExecutingAssembly()に注意してください。これをライブラリアセンブリから呼び出すと、エントリアセンブリ(つまり、元の実行可能ファイル)の名前とは異なるライブラリアセンブリの名前が返されます。GetEntryAssembly()を使用すると、実際の実行可能ファイルの名前が返されますが、プロセスがWCFで実行されている場合は例外がスローされます(確かにまれな状況です)。最も堅牢なコードには、Process.GetCurrentProcess()。ProcessNameを使用します。
Contango 2010年

答えは質問であってはなりません。それはOPが望んだことですか?
jwdonahue

1

.Net Core(またはMono)では、プロセスを定義するバイナリが、興味のある実際のアプリケーションではなく、Monoまたは.Net Core(dotnet)のランタイムバイナリである場合、ほとんどの回答は当てはまりません。その場合、 これを使って:

var myName = Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location);

1
GetEntryAssembly()nullを返すことができます。
user2864740 2017年

1

Windowsアプリ(フォームとコンソール)の場合、これを使用します。

次に、VSでSystem.Windows.Formsへの参照を追加します。

using System.Windows.Forms;
namespace whatever
{
    class Program
    {
        static string ApplicationName = Application.ProductName.ToString();
        static void Main(string[] args)
        {
            ........
        }
    }
}

これは、実際の実行可能ファイルを実行しているか、VS内でデバッグしているかに関係なく、正しく機能します。

拡張子なしでアプリケーション名を返すことに注意してください。

ジョン


1

ここはとても簡単です:

Environment.CurrentDirectory + "\\" + Process.GetCurrentProcess().ProcessName

1
.NET Coreの場合、Process.GetCurrentProcess()。ProcessNameは「dotnet」を返します。
Evgeni Nabokov、

1
現在のディレクトリは一時的なものであり、アセンブリ/実行可能ファイルの場所であるとは限りません。
jwdonahue

1

これは、拡張子なしのアプリケーション名のみが必要な場合に機能します。

Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.