2012-10-18 8 views
5

DLLを参照するCodedUIテストを実行していて、そのDLLが一種の "config"ファイルを参照しています。テストを実行中に、現在のディレクトリはCodedUIこれらはすべて私に同じを与える私はコード化されたUIを実行しているときに現在のディレクトリを解決する方法

AppDomain.CurrentDomain.BaseDirectory 

System.Reflection.Assembly.GetExecutingAssembly().CodeBase 

System.Reflection.Assembly.GetExecutingAssembly().Location 

を使用していたテスト結果ファイルを置く1を返します。パス

私が必要とするのは、DLLが存在するパスを取得することです。これは、config fiルが建設される。

私がデバッグしている場合、またはテストを実行している場合(明らかに)、私はそれを使用して逆方向に移動することはできません。

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

編集:

は私が参照していますDLL内からこの設定ファイルを参照しています。

+0

完全なソースコードを含む最終的な解決策? – Kiquenet

答えて

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へのパスを取得するために、これを使用していました。

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

+0

同じタスクを達成するために埋め込みリソースを実装しただけですが、これは素晴らしいことです!私はマイクロソフトがなぜこのような方法でテストを実装することにしたのだろう... –

+0

誰にでもこれを使っている人が誰でも知って欲しいだけです。返されるパスは通常はビルドの場所です。このパスから返されたパスを使用するテストを実行しているときに、同時に新しいビルドを実行しようとするとファイルは実行中にロックされ、テストが失敗するか、コンパイルが失敗するか、または両方が失敗する可能性があります。 –

1

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

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

CodeBaseLocationプロパティは、多くの場合、同じ情報を返すが、

  • コードベースは非常に異なっている:それは負荷
  • 場所中に参照されたように、これは、組み立てのための場所が含まれています。これはどこですアセンブリは実際にディスクからロードされました

これらは、シャドウ・コップ(Asp.Net、xUnitなど)

+0

あなたの提案をありがとうが、これは私に他の2つの機能と同じ道を得ています。もっと明確にする必要があるかもしれない。 –

+0

これがうまくいかない理由は、それがコピーされてから別の方法でロードされているからです。 –

関連する問題