1

私のアプリケーションのEndToEndテストには、releasedllを手動でロードすることが含まれます。

テスト中、私は常に次のものをロードします。-n個のデバッグアセンブリのNUnitシャドウコピー-n個のリリースアセンブリのPostbuildeventcopy

2つのコピーが同じビルド生成(バージョン)からのものであると確信している場合でも、リフレクションロードのキャストは失敗します。

ここで少しコンテキストを与えるために、いくつかの擬似コードがあります。

private HookingHelper globalhooker;
private Tools.ISomething globalmockery;


TestfixtureSetUp(){
    globalhooker = new globalhooker();
    globalhooker.Loadfrom("c:\postbuildcopy.dll");
    globalmockery = Mockrepository.Generate<Tools.ISomething>();
    globalhooker.SetViaReflection<Tools.ISomething>("nameofsomething", globalmockery);
 }

Loadfromを使用してアセンブリ内の静的を取得するヘルパークラスがあります。何かを呼び出す前に、モックを注入する必要があります。

このモックは、nunitが作成するため、デバッグバージョンのツールライブラリのシャドウコピーを使用して作成されます。

ロードされたライブラリはリリースバージョンです。これは、実際の環境にできるだけ近いテストを実行したいので、私にとって重要です。

リフレクションを使用して注入しようとするとFieldInfo SetValue(...)、呼び出しを使用する必要があります。次のようになります。

    public static void ReplaceFieldPublicStatic<T>(Type type, string fieldname, T obj)
    {
        FieldInfo field = AssemblyHelper.GetFieldInfoPublicStatic(type, fieldname);
        field.SetValue((T)obj, obj);
    }

Somethimes the Reflectionは機能し、私のタイプが互いにキャストできない場合があります。

エラーは、によって生成されたArgumentExceptionFieldInfo SetValue(...)です。

field.FieldType != typeof(T)例外を無視して、GetHashCode()呼び出しのみの違いを調べると、異なる値が得られます。

少しランダム性が関係していると思います。

タイプキャストを強制できますか?それも賢明ですか?

私が見逃しているプロジェクトを構築している間に私がしなければならないことがありますか?

4

1 に答える 1

0

2つのコピーが同じビルド生成(バージョン)からのものであると確信している場合でも、リフレクションロードのキャストは失敗します。

はい-2つのタイプが2つの異なるAssemblyオブジェクトからのものである場合、CLRに関する限り、それらは異なるタイプです。アセンブリはまったく同じバイトシーケンスからロードされた可能性がありますが、それでも別個のアセンブリです。

基本的に、タイプごとに使用するものを1つ 選択する必要があります。Assembly

于 2012-05-23T15:00:22.600 に答える