【问题标题】:C# load a dll from file, then update that dll and then re-load the dll from fileC# 从文件加载 dll,然后更新该 dll,然后从文件重新加载 dll
【发布时间】: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

【问题讨论】:

标签: c# dll reflection binding appdomain


【解决方案1】:

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

此方法的一个小警告 - 一旦使用了 LoadFile 或 LoadFrom -windows 会将该文件视为应用程序正在使用的文件,因此您无法删除 dll 文件,您必须重命名它,然后添加一个新文件

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多