我正在开发一个程序,该程序采用XML配置并完成一系列任务,作为工作中自动化的补充。
我们已经从通用实用程序/过程创建了包装器,它们编译成.dll,以便在从接口继承的运行时加载。程序读取XML配置,加载正确的dll,将其转换为接口类型,调用它的init()方法从XML文件传递参数,如果接收到正确的返回码,则调用它的start()方法。
这些dll可以做任何事情,从内部/第三方应用程序自动化到环境操作。
这在Dev机器上完美运行,我在XML文件中有4个不同的任务,运行时程序调用正确的dll,强制转换并运行自动化任务。但是,当我移动到除Dev机器之外的任何其他机器时,我在尝试转换DLL时遇到COM错误。
调用目标抛出了异常 System.Runtime.InteropServices.COMException(0x80040154):使用CLSID检索COM类工厂组件
{1A671297-FA74-4422-80FA-6C5D8CE4DE04}由于以下错误而失败:80040154未注册类(例外HRESULT:0x80040153(REGDB_E_CLASSNOTREG))
每个模块都在VS2010中自己的解决方案中生成,并引用与主项目相同的moduleInterface.dll。我在模块没有实现接口并且缺少方法之前看到了COM错误,它抛出了这个异常,因为它没有实现正确的方法集作为此接口的类型。但是,这些模块肯定有效。
这就是我加载和转换模块的方式
Assembly test = Assembly.LoadFile(Path.Combine(Prefs.ModulePath, tmodule));
Console.Write("Getting type..\r\n");
Type type = test.GetTypes().FirstOrDefault();
Console.Write("Casting module\r\n");
currentModule = (Imodule.Imodule)Activator.CreateInstance(type);
它还可以在安装了vs2010的第二台Dev机器上正常运行,这让我觉得我错过了一些运行时可分发的?我在Win7x64,Win8.1x64,Win8x86,Server 2008 R2上测试了这一点,并且都无法正确地投射模块。
现在有点想法,我对C#还不熟悉,并且真的不知道下一步该尝试什么。