无法在非开发机器上加载DLL

时间:2014-02-19 15:02:45

标签: c# .net dll

C#DLL加载问题

我正在开发一个程序,该程序采用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#还不熟悉,并且真的不知道下一步该尝试什么。

0 个答案:

没有答案