1. ホーム
  2. c#

[解決済み] コードが含まれるアセンブリのパスを取得するにはどうすればよいですか?

2022-03-20 14:47:19

質問

現在のコードが存在するアセンブリのパスを取得する方法はありますか? 私はコードを含むアセンブリだけで、呼び出し側のアセンブリのパスが欲しいのではありません。

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

編集 : みんな私が聞いていることを誤解しているようだ。

私のテストライブラリは、以下の場所にあります。

C:\projectsmyapplication daotestsDebugdaotests.dll

で、このパスを取得したいのですが。

C:\projectsmyapplication³³daotests³³bin³³Debug

これまでの3つの提案では、MbUnit Guiから実行すると失敗します。

  • Environment.CurrentDirectory 与える c:\Program FilesMbUnit

  • System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location 与える C:\Documents and Settingsgeorge Local SettingsTemp\ ...\DaoTests.dll

  • System.Reflection.Assembly.GetExecutingAssembly().Location は、前と同じように表示されます。

解決方法は?

ユニットテストでよく使うので、以下のプロパティを定義しました。

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 を使用する場合 (アセンブリが一時フォルダから実行される場合) に、時々おかしな結果をもたらすので、私はむしろ CodeBase を使用すると、URI 形式でパスを提供し、次に UriBuild.UnescapeDataString を削除します。 File:// を冒頭に、そして GetDirectoryName は、通常のウィンドウズ形式に変更します。