0

誰かが私に何が起こっているのか説明してもらえますか? サービスのダミー インスタンスをテストするテスト プロジェクトがあります。テスト プロジェクトでは、dummyService.exe と System.SystemProcess dll を参照するだけです。

ただし、私の dummyService プロジェクトでは、クラス ライブラリを参照しました。このクラス ライブラリ自体は、ソリューション内の他のプロジェクトだけでなく、他のコンポーネントからの他の dll も使用します。

問題は、テストを実行すると、例外がスローされることです (ダミー サービスでロードされて動作している dll の First Chance 例外) に加えて、invalidcast 例外 (以下のエラー メッセージ) が発生します。

タイプ「Export.CaseOutputGenerator」のオブジェクトをタイプ「Export.ICaseOutputGenerator」にキャストできません。System.InvalidCastException がキャッチされました メッセージ = タイプ 'Export.CaseOutputProcess.CustomCaseOutputGenerator' のオブジェクトをタイプ 'Export.CaseOutputProcess.ICaseOutputGenerator' にキャストできません。Source=Export.CaseOutputProcess StackTrace: C:\Monitor\Export.CaseOutputProcess\CaseOutputGeneratorFactory.cs の Export.CaseOutputProcess.CaseOutputGeneratorFactory.GetCaseOutputGeneratorObject(String assemblyName, String className) で: Monitor.BOMock.GenerateCaseOutput(String OutputFolder, String iFile で 56 行目) 、Int32 seqNum、DataTable CaseSettings、String SettingFileName) の C:\Monitor\BOMock\BOMock.cs:line 1069 at Monitor.BOMock.Handling() in C:\Monitor\BOMock\BOMock.cs:line 492 InnerException:

     public static ICaseOutputGenerator GetCaseOutputGeneratorObject(string assemblyName, string className)
            {
                ICaseOutputGenerator customeOutputGen = null;

                var obj = GetObject(assemblyName, className);
                if (obj != null)
                    caseOutputGen = (ICaseOutputGenerator)obj; // FAILS HERE
                return caseOutputGen;
            }

   private static object GetObject(string fullName, string className)
        {
            try
            {
                Type caseOutputGen = null;
                var localAssembly = Assembly.LoadFrom(fullName);
                foreach (var testType in localAssembly.GetTypes())
                {
                    if (!testType.FullName.EndsWith(className, StringComparison.InvariantCultureIgnoreCase)) continue;
                    caseOutputGen = testType;
                    break;
                }
                if (caseOutputGen == null) return null;

                var obj = Activator.CreateInstance(caseOutputGen);
                return obj;
            }
            catch (FileNotFoundException ex)
            {
                throw new Exception("Failed to load assembly: " + Environment.NewLine + fullName, ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Failed to load assembly: " + Environment.NewLine + fullName, ex);
            }
        }

assemblyName はロードする dll ファイルへのパスであり、className はたまたまインスタンスを作成するクラスの名前です。

ご覧のとおり、コードでは、リフレクションを使用して、指定された assemblyName PATH (String assemblyName) http://msdn.microsoft.com/en-us/library/system.reflection.assembly.loadfrom.aspxでアセンブリをロードします。次に、再度リフレクションを使用して、読み込まれたアセンブリに含まれる className (String className ) のインスタンスを作成します。http://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx

この問題を解決するにはどうすればよいですか? テスト プロジェクトですべての dll を参照する必要はありません。この問題を回避または解決するにはどうすればよいですか?? 前もって感謝します。

4

1 に答える 1

0

そのスタック トレースに基づいて、型が存在するアセンブリが見つからないようです。コンパイルされた exe への参照を追加するだけでは、他のライブラリを一緒に取得することはおそらくないでしょう。いくつかの選択肢があると思います:

  1. テスト プロジェクトに他のライブラリへの参照を追加します。それらは通常、推移的ではありません。サービスがそれらを認識しているからといって、テストのアセンブリもそれらを認識しているとは限りません。
  2. 他のアセンブリをコピーするコンパイル後の手順をテストのプロジェクトに追加して、テストを実行しているアプリ ドメインが検出できるようにします。
  3. 依存性注入とコントロール コンテナーの反転を使用します。そこにはかなりの数がありますが、Castle Windsor、StructureMap、および Unity が思い浮かびます。Scott Hanselman は、彼のブログでそれらの優れたリストを入手しました: http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx
于 2013-02-25T22:46:19.227 に答える