tldr; 我需要能够引用 dll,更新 dll,然后引用新的 dll
我们有一项服务需要数周才能在我们的生产系统上更新,而一个用例需要不到一天的更新周期,我们对此的解决方案是让系统直接将 .dll 文件加载到自身中,然后使用这些程序集中的类/方法。问题是我似乎只能引用第一个 dll,任何使用新 dll 的尝试都会被忽略。
我拥有的功能代码是
Assembly myAssembly1 = Assembly.LoadFrom("path.dll");
Type myType = myAssembly1.GetType("ClassName");
var myObject = Activator.CreateInstance(myType);
dynamic test = myType.InvokeMember("methodName", BindingFlags.InvokeMethod, null, myObject, null);
await test;
这个方法被引用了几次,显然第一个“LoadFrom”是唯一一个真正改变应用程序域的方法。
我知道每次创建一个新的 App 域都会解决这个问题,但我似乎无法让它工作;
AppDomain domain = AppDomain.CreateDomain("MyDomain");
Assembly myAssembly1 = domain.Load(AssemblyName.GetAssemblyName(path));
//or = domain.Load(path);
//or = domain.Load("assemblyname");
Type myType = myAssembly1.GetType("ClassName");
var myObject = Activator.CreateInstance(myType);
dynamic test = myType.InvokeMember("methodName", BindingFlags.InvokeMethod, null, myObject, null);
await test;
AppDomain.Unload(domain);
到目前为止,任何将 .dll 文件加载到我的应用程序域中的尝试都导致了错误“错误:无法加载文件或程序集“程序集名称,版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = null”或其依赖项之一. 系统找不到指定的文件。',我假设这是我没有将 .dll 文件放在正确的位置,或者没有正确处理依赖项。
任何帮助将不胜感激,我一直在尝试不同的东西,似乎一直在撞墙
提前致谢
如何
编辑:Windows 10,.net 标准 2.0
LoadFile 和 LoadFrom 与 .NET 程序集的区别?这确实部分回答了我的问题(感谢 Hasan)
这种方法的一点警告 - 一旦使用了 LoadFile 或 LoadFrom -windows 将文件视为正在被应用程序使用,因此您无法删除 dll 文件,您必须重命名它,然后添加一个新文件
找到的另一个解决方案是:每次更改 dll 的程序集名称(对其进行版本控制)都会起作用,因为 LoadFrom 不再认为 dll 库是相同的。这样做的好处是让您不必担心依赖项,因为每次您可以重复使用 LoadFrom 时,程序集名称都不同。使用这种方法,您仍然需要重命名旧的 dll 文件,或者使用 DB 脚本来更新每个版本的文件位置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句