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

C#从文件加载dll,然后更新该dll,然后从文件重新加载dll,c#,dll,reflection,binding,appdomain,C#,Dll,Reflection,Binding,Appdomain,tldr;我需要能够引用dll,更新dll,然后引用新的dll 我们有一个需要几周才能更新生产系统的服务,还有一个用例需要不到一天的更新周期,我们的解决方案是让系统直接将.dll文件加载到自身中,然后使用这些程序集中的类/方法。问题是我似乎只能引用第一个dll,任何使用新dll的尝试都会被忽略 我拥有的功能代码是 Assembly myAssembly1 = Assembly.LoadFrom("path.dll"); Type myType = myAssembly1.GetType("Cla

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”是唯一一个实际更改应用程序域的方法

我知道每次创建一个新的应用程序域都会解决这个问题,但我似乎无法让它正常工作

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文件放在正确的位置,或者没有正确处理依赖项

任何帮助都将不胜感激,我一直在尝试不同的事情,似乎总是碰壁

提前谢谢

编辑: windows 10、.net标准2.0

这部分回答了我的问题(谢谢Hasan)

此方法有一点需要注意-使用LoadFile或LoadFrom后,windows会将该文件视为应用程序正在使用中,因此您无法删除dll文件,必须重命名该文件,然后添加新文件


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

您运行的是哪个版本的.net和哪个操作系统?事情有点不同,因为您可能需要在新创建的AppComain中运行的方法中运行程序集加载代码。因此,创建一个包含
程序集的类。加载
以及访问此程序集的所有代码,并使用