C#从文件加载一个dll,然后更新该dll,然后从文件重新加载dll

C# load a dll from file, then update that dll and then re-load the dll from file

tldr;我需要能够引用一个 dll,更新 dll,然后引用新的 dll

我们有一项服务需要数周才能在我们的生产系统上更新,并且一个用例需要不到一天的更新周期,我们对此的解决方案是让系统将 .dll 文件直接加载到本身,然后使用这些程序集中的 classes/methods。问题是我似乎只能引用第一个 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 文件加载到我的应用程序域的尝试都会导致错误“错误:无法加载文件或程序集 'assemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 或其依赖项之一。系统找不到指定的文件。',我假设这是我没有将 .dll 文件放在正确的位置,或者没有正确处理依赖项。

任何帮助将不胜感激,我一直在尝试不同的事情并且似乎将 运行 固定在墙上

提前致谢

编辑: windows10、.net 标准 2.0

Difference between LoadFile and LoadFrom with .NET Assemblies? 这确实部分回答了我的问题(感谢 Hasan)

此方法的一些注意事项 - 一旦使用了 LoadFile 或 LoadFrom -windows 将文件视为正在被应用程序使用,因此您不能删除 dll 文件,您必须重命名然后添加一个新文件

找到的另一个解决方案是:每次更改 dll 的程序集名称(对其进行版本控制)将起作用,因为 LoadFrom 不再将 dll 库视为相同。这样做的好处是让您不必担心依赖关系,因为程序集名称每次都不同,您可以重复使用 LoadFrom。使用这种方法你仍然需要重命名旧的 dll 文件,或者有一个数据库脚本来更新每个版本的文件位置。