5

DLLを参照し、DLLが一種の「構成」ファイルを参照するCodedUIテストを実行しています。テストの実行中、現在のディレクトリは、CodedUIが使用したテスト結果ファイルを配置するディレクトリを返します。

AppDomain.CurrentDomain.BaseDirectory

System.Reflection.Assembly.GetExecutingAssembly().CodeBase

System.Reflection.Assembly.GetExecutingAssembly().Location

これらはすべて私に同じ道を与えます

必要なのは、DLLが存在するパスを取得することです。これは、構成ファイルがビルドされる場所だからです。

デバッグしている場合、またはテストを実行しているだけの場合(明らかに)、これが配置される場所が変わるため、これを使用して後方に移動することはできません。

参照しているDLLの場所を取得する他の方法はありますか?

編集:

参照しているDLL内からこの構成ファイルを参照しています。

4

2 に答える 2

3

これまでのところ、テストdllへの元のパスを見つけた唯一の場所は、テストコンテキストのプライベート変数です。結局、リフレクションを使用して値を取得し、使用できるようにしました。

    using System.Reflection;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    public static string CodeBase(
        TestContext testContext)
    {
        System.Type t = testContext.GetType();
        FieldInfo field = t.GetField("m_test", BindingFlags.NonPublic | BindingFlags.Instance);
        object fieldValue = field.GetValue(testContext);
        t = fieldValue.GetType();
        PropertyInfo property = fieldValue.GetType().GetProperty("CodeBase");
        return (string)property.GetValue(fieldValue, null);
    }

これを使用して、実行中のDLLへのパスを取得し、それを使用して、テストが行​​われたのと同じ場所にコンパイルされていることがわかっているアプリケーションを実行しました。

誰かがこれを取得するためのより良い方法を見つけたら、私にも知らせてください。

于 2013-06-05T18:40:40.157 に答える
1

特定のDLLがロードされた場所のディレクトリを取得する最良の方法は、そのアセンブリで定義されているタイプで次を使用することです。

var type = typeof(TypeInThatAssembly);
var path = Path.GetDirectory(type.Location);

CodeBaseandLocationプロパティは同じ情報を返すことがよくありますが、非常に異なります

  • CodeBase:これには、ロード中に参照されたアセンブリの場所が含まれます
  • 場所:これは、アセンブリが実際にディスク上からロードされた場所です

これらは、シャドウコピーされたアセンブリ(Asp.Net、xUnitなど)を使用するアプリケーションで異なる場合があります。

于 2012-10-18T19:54:57.580 に答える