回答:
System.AppDomain.CurrentDomain.FriendlyName
System.AppDomain.CurrentDomain.FriendlyName
Click-Onceでデプロイされたアプリケーションの使用に問題がありました。私たちにとって、これは元のexe名ではなく、「DefaultDomain」を返します。
string file = object_of_type_in_application_assembly.GetType().Assembly.Location; string app = System.IO.Path.GetFileNameWithoutExtension( file );
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()
、上記と同じ結果を得ることができます。
/?
スイッチ)に非常に役立ちます。これは、拡張子とパスを使用すると、不必要に混乱するためです。
GetCurrentProcess()
Process.GetCurrentProcess().ProcessName()
MyApp.vshostを返します。
System.Diagnostics.Process.GetCurrentProcess()
現在実行中のプロセスを取得します。ProcessName
プロパティを使用して、名前を把握できます。以下はコンソールアプリのサンプルです。
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Process.GetCurrentProcess().ProcessName);
Console.ReadLine();
}
}
.../bin/mono
* nixesまたは.../mono.exe
Windowsのバリアントになります。
これで十分です:
Environment.GetCommandLineArgs()[0];
Environment.GetCommandLineArgs()
正確なC#の類似物だargv
からです。
Path.GetFileNameWithoutExtension(Environment.GetCommandLineArgs()[0])
これは私のために働いたコードです:
string fullName = Assembly.GetEntryAssembly().Location;
string myName = Path.GetFileNameWithoutExtension(fullName);
上記のすべての例では、vshostまたは実行中のdll名を含むprocessNameを取得しています。
これを試して:
System.Reflection.Assembly.GetExecutingAssembly()
これによりSystem.Reflection.Assembly
、現在のアプリケーションについて知りたいすべてのデータを含むインスタンスが返されます。Location
物件は具体的にはあなたが欲しいものを手に入れるかもしれないと思います。
CodeBase
はLocation
、代わりに使用した方が安全な場合があります。blogs.msdn.com/suzcook/archive/2003/06/26/…を
さらにいくつかのオプション:
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
ファイアウォールルールを設定するためにプログラム名が必要な場合は、以下を使用します。
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
これにより、VisualStudioでデバッグするときと、ウィンドウで直接アプリを実行するときの両方で、名前が正しいことが保証されます。
確信が持てない場合や疑問がある場合は、輪になって走り、叫び、叫びます。
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");
}
}
私は各オプションをテストしたと主張することはできませんが、デバッグセッション中に仮想ホストを返すような愚かなことは何もしません。
System.Reflection.Assembly.GetEntryAssembly().Location
アセンブリがメモリから読み込まれていない場合は、exe名の場所を返します。System.Reflection.Assembly.GetEntryAssembly().CodeBase
場所をURLとして返します。実行可能ファイルの完全パス情報を探している場合、信頼できる方法は次を使用することです:
var executable = System.Diagnostics.Process.GetCurrentProcess().MainModule
.FileName.Replace(".vshost", "");
これにより、中間dll、vshostなどの問題がなくなります。
を使用Environment.GetCommandLineArgs()
して、引数Environment.CommandLine
を取得したり、入力したとおりに実際のコマンドラインを取得したりできます。
また、Assembly.GetEntryAssembly()
またはを使用できますProcess.GetCurrentProcess()
。
ただし、デバッグするときは、他の例と同様に、この最後の例では実行可能ファイルではなくデバッガの実行可能ファイルの名前(デバッガの接続方法によって異なる)が表示される可能性があるため、注意が必要です。
Environment.CommandLine
少なくともMono / Linuxでは、入力されたコマンドラインではなく、絶対パスを指定します。
これは、あなたの望むことですか:
Assembly.GetExecutingAssembly ().Location
.Net Core(またはMono)では、プロセスを定義するバイナリが、興味のある実際のアプリケーションではなく、Monoまたは.Net Core(dotnet)のランタイムバイナリである場合、ほとんどの回答は当てはまりません。その場合、 これを使って:
var myName = Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location);
GetEntryAssembly()
nullを返すことができます。
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内でデバッグしているかに関係なく、正しく機能します。
拡張子なしでアプリケーション名を返すことに注意してください。
ジョン
ここはとても簡単です:
Environment.CurrentDirectory + "\\" + Process.GetCurrentProcess().ProcessName