当前位置: 首页 > 编程语言 > C#

是否可以在运行时切换DLL以使用不同的版本?分享

时间:2023-04-11 01:04:44 C#

是否可以在运行时切换DLL以使用不同的版本?我有一个应用程序,其中包含许多连接到许多不同I/O设备的插件(MEF)。这些插件中的大多数都有许多托管和非托管dll。一家制造商最近发布了新固件和新驱动程序。API保持不变。我想我可以将两个dll版本包含在单独的资源文件夹中,并在应用程序启动时将所需的集合复制到输出文件夹。(我想我可以制作插件的第二个副本并弄清楚如何加载正确的插件,但我认为复制DLL可能更容易-特别是考虑到插件代码没有改变)这没有用.staticMyClass()//静态构造函数{//需要的版本?如果(envvar.Equals("4")){path="ver4.1.1";}else{path="ver2.5.1";}//驱动程序的位置path=Path.Combine("./Prj/QX",path);字符串[]文件=Directory.GetFiles(路径);//复制文件并覆盖目标文件(如果它们已经存在)。foreach(stringsinfiles){stringfileName=Path.GetFileName(s);stringdestFile=Path.Combine(".",fileName);File.Copy(s,destFile,true);}//强制加载组件Assemblyassy=LoadWithoutCache("driver.dll");字符串fn=assy.FullName;}staticAssemblyLoadWithoutCache(stringpath){使用(varfs=newFileStream(path,FileMode.Open)){varrawAssembly=newbyte[fs.Length];fs.Read(rawAssembly,0,rawAssembly.Length);返回Assembly.Load(rawAssembly);}}错误消息显示原始DLL已加载或应已加载但不能。无法加载文件或程序集“驱动程序,Version=1.5.77,Culture=neutral,PublicKeyToken=983247934”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(HRESULT异常:0x80)实现我的目标的方式,还是我必须构建我的应用程序的2个单独版本?编辑我还应该说没有必要同时加载两个DLL。使用导致加载一个或另一个DLL的参数启动应用程序就足够了。实现此目的的一种(复杂的)方法是:1.使用FileSystemWatcher(FSW)监视文件夹FSW检测组件是否已更改或删除。2.将程序集加载到仅反射上下文加载到该上下文中的程序集只能被检查!通过获取程序集的类型并检查该类型是否实现了PluginInterface,确保程序集类型实现了PluginInterface。3.使用卷影复制将程序集加载到单独的AppDomain由于您只能卸载AppDomain及其所有程序集,因此您需要将每个插件程序集加载到其自己的AppDomain中。这将卸载插件的AppDomain。务必杀死插件的所有进程/线程!卷影复制通过将程序集复制到临时路径来确保对原始文件的更改。4.TrackLoadedComponents将加载成功的组件路径放入列表中。这使得检测程序集是否需要加载/重新加载变得更加容易。5.处理FSW事件以检查哪个.dll被更改/删除以卸载程序集,或检测一个新程序集以加载它。6.转到步骤2问候,Blackanges您可以通过多种方式执行此操作。一种可能性是使用托管可扩展性框架(MEF)。您甚至可以监控dll所在的文件夹,并在新版本可用时立即加载它。另一种可能性是您可以使用反射在运行时动态加载所需的dll。也许您可以通过这样的反射在运行时加载您的dll:LoadingDLLsatruntimeinC#但我怀疑它是否适用于更大的项目。的版本?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: