gpt4 book ai didi

C# 后期绑定(bind)在运行时卸载 Dll

转载 作者:行者123 更新时间:2023-11-30 23:26:16 26 4
gpt4 key购买 nike

我想在运行时将 .dll 作为插件加载到我自己的 c# 程序中。如果有新的更新卸载现有的插件 dll (InvokeHelper. dll) 并下载更新的.dll (InvokeHelper.dll) 并将其加载到程序中而不终止进程。(我的应用程序)。我阅读了这些文章来完成这些任务(MSDN, Article2)但是这段代码仍然无法动态卸载 .dll

当我通过进程资源管理器查看附加的 dll 时,附加的 dll 没有被卸载。它存在于 process explorer 中。 dll 列表。我想如果 dll 卸载成功我想手动重命名旧的 dll 并替换新的。

InvokeHelper.dll 来源:

using System;

namespace InvokeHelper
{
public class LateBindingInvokeHelper
{
public void PrintHello()
{
using (System.IO.StreamWriter w = new System.IO.StreamWriter(@"Invoker.txt", true))
{
w.WriteLine(DateTime.Now.ToString());
w.Flush();
}
}
}
}

加载Dll函数:

 private AppDomain domain = null;
private void LoadDll()
{
AppDomainSetup domInfo = new AppDomainSetup();
domInfo.ApplicationBase = System.Environment.CurrentDirectory;
Evidence adevidence = AppDomain.CurrentDomain.Evidence;
domInfo.DisallowBindingRedirects = false;
domInfo.DisallowCodeDownload = true;
domain = AppDomain.CreateDomain("MyDomain", adevidence , domInfo);

Type type = typeof(Proxy);
var value = (Proxy)domain.CreateInstanceAndUnwrap(
type.Assembly.FullName,
type.FullName);

var assembly = value.GetAssembly(@"C:\dev\ExBinder\ExBinder\bin\Debug\InvokeHelper.dll");
Type[] mytypes = assembly.GetTypes();
BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
foreach (Type t in mytypes)
{
MethodInfo[] mi = t.GetMethods(flags); // you can change this flag , commented some flags :) view only plublic or bla bla
Object obj = Activator.CreateInstance(t);
foreach (MethodInfo m in mi)
{
if (m.Name.Equals("PrintHello")) m.Invoke(obj, null); //my func name :) you can set this via config :D
}
}
}

private void button2_Click(object sender, EventArgs e)
{
LoadDll();
AppDomain.Unload(domain);
}

代理类

public class Proxy : MarshalByRefObject
{
public Assembly GetAssembly(string assemblyPath)
{
try
{
return Assembly.LoadFile(assemblyPath);
}
catch (Exception)
{
return null;
}
}
}

enter image description here

最佳答案

问题是您在单独的 AppDomain 中加载程序集并通过代理返回该 Assembly,因此同样的程序集也会加载到您的默认 AppDomain 中。我已将您的调用逻辑移至代理类中并且它起作用了。

public class Proxy : MarshalByRefObject
{
public void Run()
{
var assembly = AppDomain.CurrentDomain.Load(File.ReadAllBytes(@"C:\Users\Mkrtich_Mazmanyan\Downloads\ExBinder\Exbinder\bin\Debug\InvokeHelper.dll"));

Type[] mytypes = assembly.GetTypes();
BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
foreach (Type t in mytypes)
{
MethodInfo[] mi = t.GetMethods(flags); // you can change this flag , commented some flags :) view only plublic or bla bla elshan
Object obj = Activator.CreateInstance(t);
foreach (MethodInfo m in mi)
{
if (m.Name.Equals("PrintHello")) m.Invoke(obj, null); //my func name :) you can set this via config :D
}
}
}
}

调用部分将是:

value.Run();

关于C# 后期绑定(bind)在运行时卸载 Dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36933864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com