誰かが私に何が起こっているのか説明してもらえますか? サービスのダミー インスタンスをテストするテスト プロジェクトがあります。テスト プロジェクトでは、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 を参照する必要はありません。この問題を回避または解決するにはどうすればよいですか?? 前もって感謝します。