2013-02-25 5010 views
0

有人可以請解釋發生在我身上的事情嗎?我有一個測試項目,測試我的服務的虛擬實例。在測試項目中,我只需引用dummyService.exe和System.SystemProcess dll。無法投出XXXXXX類型的對象來鍵入IXXXXX(.NET 4.0)

然而,在我的dummyService項目中,我引用了類庫,它本身使用其他組件的其他組件以及我的解決方案中的其他項目。

問題是,當我運行我的測試時,會拋出異常(加載並在dummyService中工作的dll的第一個機會異常),另外還有invalidcast異常(下面的錯誤消息)。

無法投射「Export.CaseOutputGenerator」類型的對象以鍵入「Export.ICaseOutputGenerator」。 System.InvalidCastException被捕獲 Message =無法將類型爲'Export.CaseOutputProcess.CustomCaseOutputGenerator'的對象強制類型爲 'Export.CaseOutputProcess.ICaseOutputGenerator'。 源= Export.CaseOutputProcess 堆棧跟蹤: 在Export.CaseOutputProcess.CaseOutputGeneratoryFactory.GetCaseOutputGeneratorObject(字符串的AssemblyName,字符串的className) 在C:\監視器\ Export.CaseOutputProcess \ CaseOutputGeneratoryFactory.cs:線56 在Monitor.BOMock.GenerateCaseOutput(字符串OutputFolder,字符串iFile,Int32 seqNum,數據表CaseSettings,字符串SettingFileName) in 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。我該如何解決或解決這個問題?提前致謝。

+0

你有沒有看過Ninject的注射劑? – DiskJunky 2013-02-25 22:14:01

+2

什麼是* full *消息?這個*通常是*當你在兩個不同的程序集中聲明瞭'ICaseOutputGenerator'時 - 在這種情況下,這是兩個不同的和不相關的'ICaseOutputGenerator'接口。 – 2013-02-25 22:21:51

+0

這恰好是完整的信息。我不確定我應該發佈什麼其他信息。請讓我知道你需要我發佈什麼。 – Kobojunkie 2013-02-25 22:34:02

回答

0

基於該堆棧跟蹤,它看起來像沒有找到類型所在的程序集。如果您只是將引用添加到已編譯的exe文件中,則可能無法將其他庫與其一起使用。我認爲你有幾個選擇:

  1. 繼續前進並咬緊牙關:在您的測試項目中添加對其他庫的引用。它們通常不是傳遞性的:僅僅因爲你的服務知道它們並不一定表明你的測試程序集也知道它們。
  2. 爲您的測試項目添加一個後期編譯步驟,該步驟將複製其他程序集,以便運行測試的應用程序域可以找到它們。
  3. 使用依賴注入和控制容器的反轉。這裏有很多,但溫莎城堡,StructureMap和Unity讓人想起。 Scott Hanselman在他的博客上獲得了很多他們的名單:http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx
+0

我一直在測試這些相同的,在此之前,相當成功地沒有做任何你在那裏建議。我試圖測試這個服務,這個測試沒有意義,它會讓服務運行而不需要知道它裏面的所有內容嗎? – Kobojunkie 2013-02-25 22:48:47

+0

可能。我認爲這實際上取決於你的測試實際上在做什麼,以及對服務可執行文件的引用是否將該可執行文件複製到測試程序集的文件夾中,而不會複製可執行文件的依賴關係。 – ohTHATaaronbrown 2013-02-25 22:53:14

+0

看起來你正在使用一個嘲諷庫。嘲笑圖書館有可能在靜力學方面遇到麻煩嗎? – ohTHATaaronbrown 2013-02-25 22:59:21

相關問題