21

私のアプリでは、いくつかの構成ファイルをアセンブリ (exe) と共に xml に保存し、処理目的でその他の一時ファイルを保存します。

".\\"との奇妙な点を見つけましApplication.StartupPathた。

使ってきました

String configPath = ".\\config.xml";

OpenFIleDialog他のフォルダーのいくつかのファイルを開くために呼び出すまでは正常に動作し、上記のステートメントは失敗しました。どうやら「.\」は「CurrentDirectory」を参照しており、別のフォルダーを参照するたびに変更されます。

ある時点で、私は使用していました

String configPath = Path.Combine(Application.StartupPath + "config.xml");

ある時点で、 を使用して別のフォルダーからこのアセンブリを実行する必要があるときに、状況がProcess.Start()悪化し始めます。どうやら作業ディレクトリが適切に設定されておらず、Application.StartupPath実際には、アセンブリが実行されているディレクトリではなく、作業ディレクトリを参照していると思われます。したがって、ProcessInfo を使用して、作業ディレクトリをアセンブリのディレクトリに設定する必要があります。VSTOを書いていたときも、これに問題がありました。

だから、私の質問は、アセンブリが実行されている現在のディレクトリを取得するための最良の、最も簡単で最も確実な方法は何ですか?

編集:アセンブリが存在するディレクトリを取得するつもりでした

編集: MSDN on AppDomain.BaseDirectoryによると、実行時に変更される可能性があるようですが、これは私が望んでいないことです(明確にするために、 BaseDirectory の変更を許可したくないということではなく、変更されているかどうかを確認せずに取得します)

編集:関連する質問がずっと前に投稿されたことに気付きました。実行中のアプリの現在のディレクトリが変更される原因は何ですか?

答えてくれてありがとう。

4

7 に答える 7

48
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location))
于 2008-10-31T13:40:04.703 に答える
15

以下の実装を試してください。CodeBase プロパティは場所を取得する最も信頼できる方法であり、残りのコードはそれを (URI ではなく) 標準の Windows 形式に変換します。

static public string AssemblyLoadDirectory
{
    get
    {
        string codeBase = Assembly.GetCallingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
    }
}
于 2008-11-12T16:10:08.670 に答える
10

実際の作業ディレクトリが必要ですか、それともアセンブリを含むディレクトリが必要ですか? それは完全には明らかではありません。

Environment.CurrentDirectory作業ディレクトリが必要な場合、またはアセンブリPath.GetDirectoryName(typeof(Foo).Assembly.ManifestModule.FullyQualifiedName)(または少なくともそのマニフェスト モジュール、ほとんどすべての場合で同じもの) の場所を見つける場合があります。

于 2008-10-31T13:34:56.587 に答える
5

There is also,

System.Reflection.Assembly.GetExecutingAssembly().CodeBase
于 2008-10-31T13:39:00.557 に答える
5

少し短い:

AppDomain.Current.BaseDirectory
于 2008-10-31T13:44:59.390 に答える
2

次のリンクからこのようなことを試してみます:

string path;
path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase );
MessageBox.Show( path );
于 2008-10-31T13:40:05.967 に答える
1

How about

string currentAssemblyFile = System.Reflection.Assembly.GetExecutingAssembly().Location;

and then figure it out from there...

于 2008-10-31T13:39:36.670 に答える