web-dev-qa-db-ja.com

カスタムMSBuildタスクを作成するときに、C#コードから現在のプロジェクトディレクトリを取得するにはどうすればよいですか?

そのパスをハードコードして外部プログラムを実行する代わりに、現在のプロジェクトディレクトリを取得したいと思います。カスタムタスクのプロセスを使用して外部プログラムを呼び出しています。

どうすればいいですか? AppDomain.CurrentDomain.BaseDirectoryは、VS 2008の場所を提供するだけです。

111
sean

この2つの方法のいずれかを試すことができます。

string startupPath = System.IO.Directory.GetCurrentDirectory();

string startupPath = Environment.CurrentDirectory;

どちらが良いと思いますか教えてください

102
Iralda Mitro
using System;
using System.IO;

// This will get the current WORKING directory (i.e. \bin\Debug)
string workingDirectory = Environment.CurrentDirectory;
// or: Directory.GetCurrentDirectory() gives the same result

// This will get the current PROJECT directory
string projectDirectory = Directory.GetParent(workingDirectory).Parent.FullName;
227
mohammed sameeh

プロジェクトがIISエクスプレスで実行されている場合、Environment.CurrentDirectoryはIIS Expressが配置されている場所を指すことができます(デフォルトのパスはC:\ Programファイル(x86)\ IIS Express)、プロジェクトの場所ではありません。


これはおそらく、さまざまな種類のプロジェクトに最適なディレクトリパスです。

AppDomain.CurrentDomain.BaseDirectory

これはMSDNの定義です。

アセンブリリゾルバがアセンブリのプローブに使用するベースディレクトリを取得します。

18
hina10531

これにより、現在の実行ディレクトリから2レベル上に移動してプロジェクトディレクトリが得られます(ビルドごとにプロジェクトディレクトリは返されませんが、これが最も一般的です)。

System.IO.Path.GetFullPath(@"..\..\")

もちろん、ある種の検証/エラー処理ロジック内にこれを含める必要があります。

16
nh43de

ソリューションのあるディレクトリを知りたい場合は、これを行う必要があります。

 var parent = Directory.GetParent(Directory.GetCurrentDirectory()).Parent;
            if (parent != null)
            {
                var directoryInfo = parent.Parent;
                string startDirectory = null;
                if (directoryInfo != null)
                {
                    startDirectory = directoryInfo.FullName;
                }
                if (startDirectory != null)
                { /*Do whatever you want "startDirectory" variable*/}
            }

GetCurrrentDirectory()メソッドのみで許可した場合、デバッグまたはリリースのいずれに関係なくビルドフォルダーを取得します。私はこの助けを願っています!検証を忘れると、次のようになります。

var startDirectory = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName;
10
abel406

私もこれを探していました。 HWCを実行するプロジェクトがあり、Webサイトをアプリツリーから除外したいのですが、デバッグ(またはリリース)ディレクトリに残したくないのです。 FWIW、受け入れられているソリューション(およびこれも)は、実行可能ファイルが実行されているディレクトリのみを識別します。

そのディレクトリを見つけるために、私は使用しています

string startupPath = System.IO.Path.GetFullPath(".\\").
5
Brett

さらに別の不完全なソリューション(ただし、他のいくつかのソリューションよりも完璧に近いかもしれません):

    protected static string GetSolutionFSPath() {
        return System.IO.Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).Parent.Parent.FullName;
    }
    protected static string GetProjectFSPath() {
        return String.Format("{0}\\{1}", GetSolutionFSPath(), System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
    }

現在のプロジェクトがソリューションのStartup Projectでない場合でも、このバージョンはcurrent projects 'フォルダーを返します。

これの最初の欠点は、すべてのエラーチェックをスキップしたことです。これは簡単に修正できますが、プロジェクトをドライブのルートディレクトリに保存するか、パスにジャンクションを使用する場合にのみ問題になるはずです(そのジャンクションはソリューションフォルダーの子孫です)。 。とにかく、Visual Studioがこれらのセットアップのいずれかを処理できるかどうかは完全にはわかりません。

実行される可能性のある別の(より可能性の高い)問題は、プロジェクト名mustがプロジェクトのフォルダー名と一致することです。

もう1つの問題は、プロジェクトがソリューションフォルダー内にある必要があることです。通常、これは問題ではありませんが、Add Existing Project to Solutionオプションを使用してプロジェクトをソリューションに追加した場合、これはソリューションの編成方法ではない可能性があります。

最後に、アプリケーションが作業ディレクトリを変更する場合、この値は現在の作業ディレクトリに対して相対的に決定されるため、この値を保存する前にこの値を保存する必要があります。

もちろん、これはすべて、プロジェクトプロパティダイアログのプロジェクトのBuild-> Output pathまたはDebug-> Working directoryオプションのデフォルト値を変更してはならないことも意味します。 。

4
krowe

これを試して、そのシンプルな

HttpContext.Current.Server.MapPath("~/FolderName/");
4
Hardeep Singh

これを行う別の方法

string startupPath = System.IO.Directory.GetParent(@"./").FullName;

Binフォルダーへのパスを取得する場合

string startupPath = System.IO.Directory.GetParent(@"../").FullName;

たぶんより良い方法があります=)

4
Tret

私は同様の状況にあり、Googleの実りのない状態で、公開文字列を宣言しました。これは、デバッグ/リリースパスの文字列値を変更してプロジェクトパスを取得します。このメソッドを使用する利点は、現在のプロジェクトのディレクトリを使用するため、デバッグディレクトリとリリースディレクトリのどちらで作業していても問題にならないことです。

public string DirProject()
{
    string DirDebug = System.IO.Directory.GetCurrentDirectory();
    string DirProject = DirDebug;

    for (int counter_slash = 0; counter_slash < 4; counter_slash++)
    {
        DirProject = DirProject.Substring(0, DirProject.LastIndexOf(@"\"));
    }

    return DirProject;
}

その後、1行だけを使用して、いつでも呼び出すことができます。

string MyProjectDir = DirProject();

これはmostの場合に機能するはずです。

3

これを使用して、プロジェクトディレクトリを取得します(私のために働いた):

string projectPath = 
    Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;
3
user5219877

パブリックストリングの私たちに関する最初の回答を最終的に仕上げて回答を導き出した後、レジストリから値を読み取って目的の結果を得ることができるのではないかと思いました。結局のところ、そのルートはさらに短くなりました。

まず、レジストリを操作できるように、Microsoft.Win32名前空間を含める必要があります。

using Microsoft.Win32;    // required for reading and / or writing the registry

主なコードは次のとおりです。

RegistryKey Projects_Key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\VisualStudio\9.0", false);
string DirProject = (string)Projects_Key.GetValue(@"DefaultNewProjectLocation");

この答えに関するメモ:

Visual Studio 2008 Professional Editionを使用しています。別のバージョン(つまり、2003、2005、2010など)を使用している場合、SubKey文字列の「バージョン」部分(つまり、8.0、7.0など)を変更する必要はありません。

あなたが私の答えの1つを使用し、それが質問するのにあまり多くない場合、私はあなたが私の方法のどれを使用し、なぜ知っていると思います。幸運を。

  • dm
3

試してください:

var pathRegex = new Regex(@"\\bin(\\x86|\\x64)?\\(Debug|Release)$", RegexOptions.Compiled);
var directory = pathRegex.Replace(Directory.GetCurrentDirectory(), String.Empty);

これは、他のソリューションとは異なるソリューションであり、x86またはx64ビルドの可能性も考慮されています。

2

このソリューションは、ASP.NET MVC5 via C#:を使用して、DevelopサーバーおよびTESTサーバーとPRODサーバーでうまく機能します。

var projectDir = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory);

プロジェクト構成ファイルのプロジェクトディレクトリが必要な場合:

$(ProjectDir)
2
Jan Sršeň

私は次のソリューションを使用して仕事を完了しました:

string projectDir =
    Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\.."));
2
Gucu112

Gucu112's answer に基づいていますが、.NET Core Console/Windowアプリケーションの場合、次のようになります。

string projectDir = 
    Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\.."));

これを.NET Core WindowアプリケーションのxUnitプロジェクトで使用しています。

2
zwcloud

Bin出力パスの設定に関係なく、ソースプロジェクトディレクトリを確実に取得したい場合:

  1. ビルド前のイベントコマンドラインを追加します(Visual Studio:プロジェクトプロパティ->ビルドイベント):

    echo $(MSBuildProjectDirectory) > $(MSBuildProjectDirectory)\Resources\ProjectDirectory.txt

  2. ProjectDirectory.txtファイルをプロジェクトのResources.resxに追加します(まだ存在しない場合は、プロジェクトを右クリック->新規アイテムの追加->リソースファイル)

  3. Resources.ProjectDirectoryを使用してコードからアクセスします。
0
FunctorSalad

最高のソリューション

string PjFolder1 =
    Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).
        Parent.Parent.FullName;

その他の解決策

string pjFolder2 = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(
                System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)));

テストして、AppDomain.CurrentDomain.BaseDirectoryが過去のプロジェクトで働いていたので、デバッグフォルダーを取得しました。

//Project DEBUG folder, but STILL PROJECT FOLDER
string pjDebugFolder = AppDomain.CurrentDomain.BaseDirectory;

//Visual studio folder, NOT PROJECT FOLDER
//This solutions just not work
string vsFolder = Directory.GetCurrentDirectory();
string vsFolder2 = Environment.CurrentDirectory;
string vsFolder3 = Path.GetFullPath(".\\");   

//Current PROJECT FOLDER
string ProjectFolder = 
    //Get Debug Folder object from BaseDirectory ( the same with end slash)
    Directory.GetParent(pjDebugFolder).
    Parent.//Bin Folder object
    Parent. //Project Folder object
    FullName;//Project Folder complete path
0
Eduardo Chávez
using System;
using System.IO;

// Get the current directory and make it a DirectoryInfo object.
// Do not use Environment.CurrentDirectory, vistual studio 
// and visual studio code will return different result:
// Visual studio will return @"projectDir\bin\Release\netcoreapp2.0\", yet 
// vs code will return @"projectDir\"
var currentDirectory = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);

// On windows, the current directory is the compiled binary sits,
// so string like @"bin\Release\netcoreapp2.0\" will follow the project directory. 
// Hense, the project directory is the great grand-father of the current directory.
string projectDirectory = currentDirectory.Parent.Parent.Parent.FullName;
0
JeffreyYe_THU