2013-02-25 5007 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

相关问题