有人可以请解释发生在我身上的事情吗?我有一个测试项目,测试我的服务的虚拟实例。在测试项目中,我只需引用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。我该如何解决或解决这个问题?提前致谢。
你有没有看过Ninject的注射剂? – DiskJunky 2013-02-25 22:14:01
什么是* full *消息?这个*通常是*当你在两个不同的程序集中声明了'ICaseOutputGenerator'时 - 在这种情况下,这是两个不同的和不相关的'ICaseOutputGenerator'接口。 – 2013-02-25 22:21:51
这恰好是完整的信息。我不确定我应该发布什么其他信息。请让我知道你需要我发布什么。 – Kobojunkie 2013-02-25 22:34:02