【发布时间】:2020-02-25 07:55:09
【问题描述】:
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”是唯一真正改变应用程序域的方法。
我知道每次创建一个新的应用程序域都会解决问题,但我似乎无法让它工作;
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
【问题讨论】:
-
.net 的哪个版本以及您在哪个操作系统上运行?基于此,事情有些不同
-
您需要在新创建的 AppComain 中运行的方法中运行您的程序集加载代码。因此,创建一个包含
Assembly.Load以及访问此程序集的所有代码的类,并使用 CreateInstanceAndUnwrap 实例化它
标签: c# dll reflection binding appdomain