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;
此方法get被引用了几次,显然第一个'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文件放在正确的位置,还是没有正确处理依赖项。
任何帮助将不胜感激,我不断尝试不同的方法,并且似乎不断遇到麻烦
预先感谢
Cuan
编辑:Windows 10,.net标准2.0
Difference between LoadFile and LoadFrom with .NET Assemblies?确实回答了我的问题,经过一个小时的搜索,我不知何故没有找到这个(感谢Hasan)
也将在这里留下一个替代答案-每次更改dll的程序集名称(对其进行版本化)也将起作用,因此,有一个运行DB更新脚本并每次递增程序集名称的过程也是功能解决方案(并且省去了担心依赖的麻烦)。