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

问题描述 投票:0回答:1

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

c# dll reflection binding appdomain
1个回答
0
投票

Difference between LoadFile and LoadFrom with .NET Assemblies?确实回答了我的问题,经过一个小时的搜索,我不知何故没有找到这个(感谢Hasan)

也将在这里留下一个替代答案-每次更改dll的程序集名称(对其进行版本化)也将起作用,因此,有一个运行DB更新脚本并每次递增程序集名称的过程也是功能解决方案(并且省去了担心依赖的麻烦)。

© www.soinside.com 2019 - 2024. All rights reserved.