コードが含まれているアセンブリのパスを取得するにはどうすればいいですか? 質問する

コードが含まれているアセンブリのパスを取得するにはどうすればいいですか? 質問する

現在のコードが存在するアセンブリのパスを取得する方法はありますか? 呼び出しアセンブリのパスではなく、コードを含むアセンブリのパスだけが必要です。

基本的に、私のユニット テストでは、dll に相対的に配置されているいくつかの xml テスト ファイルを読み取る必要があります。テスト dll が TestDriven.NET、MbUnit GUI、またはその他のものから実行されるかどうかに関係なく、パスが常に正しく解決されるようにする必要があります。

編集: どうやら私が尋ねていることを誤解している人が多いようです。

私のテストライブラリは、例えば

C:\projects\myapplication\daotests\bin\Debug\daotests.dll

そして、私はこのパスを取得したいと思います:

C:\プロジェクト\myapplication\daotests\bin\Debug\

これまでの 3 つの提案は、MbUnit GUI から実行したときには失敗しました。

  • Environment.CurrentDirectoryc:\Program Files\MbUnitを返します

  • System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).LocationC:\Documents and Settings\george\Local Settings\Temp\ ....\DaoTests.dll を返します。

  • System.Reflection.Assembly.GetExecutingAssembly().Location前と同じ結果になります。

ベストアンサー1

注意: Assembly.CodeBase は .NET Core/.NET 5 以降では非推奨です。https://learn.microsoft.com/en-us/dotnet/api/system.reflection.assembly.codebase?view=net-5.0

元の回答:

ユニットテストで頻繁に使用するため、次のプロパティを定義しました。

public static string AssemblyDirectory
{
    get
    {
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
    }
}

このAssembly.Locationプロパティは、NUnit (アセンブリが一時フォルダーから実行される場所) を使用する場合に奇妙な結果をもたらすことがあるため、CodeBaseURI 形式でパスを取得し、先頭のUriBuild.UnescapeDataStringを削除して、通常の Windows 形式に変更する を使用することを好みます。File://GetDirectoryName

おすすめ記事