C#动态加载dll 时程序集的卸载问题

C#动态加载dll 时程序集的卸载问题,第1张

你提到,当卸载域的时候“另一个线程还在执行这个dll里面的方法”,那么这个方法的调用方应配源该在计划卸载的域之外,这样:通过反射方法运行的代码在执行的域中(即主程序的域),这种情况下在执行域中同样加载了目标程序集(因此文件被占用),与要卸载的域锋雹无关。

如果目标程培基态序集是可执行程序,则可以令新建的域执行该代码,此时,在代码执行中突然卸载域,会从执行线程上引发AppDomainUnloadException异常。

跨应用程序域访问不是一种好的设计思路。

//Entry Point :

[DllImport("TEST.dll", PreserveSig = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall, EntryPoint = "碰派GetName"笑梁贺)]

public static extern short GetName(ushort adr)

//AssemblyLoad :

Assembly ass = Assembly.LoadFile(dllPath)

Object instance = ass.CreateInstance(className)//创建一个渣空实例

Type type = ass.GetType(className)

public string GetName(int index)

{

object[] args = { index }

object obj = type.InvokeMember(methodName, BindingFlags.Default | BindingFlags.InvokeMethod, null, instance, args)

return (string)obj

}

我先说下你想要裂丛毁的结果,你把Assembly.LoadFrom换成Assembly.LoadFile即可。

另外,你既然能够在你的应用中使用Assembly.LoadFrom这样的方法,那test1.dll他们的路径就是已知的了,何必还要通过反射程序集内部方法来获取它的Location呢?

如果你是将test1.dll注册到了全局环境中,那么我郑裤建议你不要使用LoadFrom和LoadFile,改用Load方法:将test1和test2通过版本号或者公钥(PublicKey)加以区别,然后用Load方肆备法调用。调用参数类似于:“程序集名,Version=版本1,culture=区域信息1,PublicKeyToken=公钥1”,这是微软标准的做法。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12444972.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存