c# - 从应用程序域中删除程序集

标签 c# multithreading .net-assembly appdomain

所以我试图从我的程序集中删除一个程序集 Thread.GetDomain().GetAssemblies() 面积。

到目前为止,我已经在网上查看了一些解释,但还是无法弄清楚。

这就是我到目前为止所得到的

AppDomain tempD = Thread.GetDomain();
tempD.DoCallBack(LoaderCallback);
AppDomain.Unload(tempD);
System.IO.File.Delete(assemblyName);

private static void LoaderCallback()
{
     Assembly.ReflectionOnlyLoad("myAssembly");

     //byte[] raw = System.IO.File.ReadAllBytes(test);
     //Assembly yacsi = Assembly.Load(raw);
     //((IScript)yacsi.CreateInstance("Script")).Go();
}

到目前为止,我已经尝试过这个概念,但我很难建立连接,因为 Thread.GetDomain(); 不包含 Unload 命令

此外,我无法尝试这部分 ((IScript)yacsi.CreateInstance("Script")).Go() 因为我不知道 IScript 是什么程序集,也不知道它是什么放置在“脚本”文本部分

任何想法将不胜感激

最佳答案

要添加 @RobertHarvey 的评论并退后一步,您要做的是创建一个单独的 AppDomain 并将程序集加载到其中。 之后,您可以将您想要使用的各种类型编码到您的域中。

使用完它们后,您可以卸载应用程序域,从而摆脱程序集。

您应该注意,域间实例编码(marshal)是通过 .NET Remoting 完成的,因此您可能想使用 remoting lease policies其中包括编码对象生命周期的时间值等。修改租约期限的原因是,如果根本没有调用/使用编码实例,则它会在预定义的时间段后过期。因此,您可能希望避免一遍又一遍地重新编码实例,而只是延长它们在域中的生命周期。

我认为this is a good sample展示如何将程序集加载到新的 AppDomain 中并卸载它。还有很多其他样本。

只要您知道该过程应该是什么,找到它的代码就很简单。

关于c# - 从应用程序域中删除程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16799227/

相关文章:

c# - 如何使用 C# 在 NLog 中使用条件进行过滤

java - 锁定问题: needs some brainstorming suggestions

java - 通过 final方法参数安全发布?

c# - 无法在 Mono 服务器上加载类型

c# - 找不到适合指定区域性的任何资源

c# - .snk 文件的位置及其管理

c# - 怎么检测主硬盘盘符如C : drive?

c# - 为什么当我对行进行更改时 DataRowState 显示已添加而不是已修改?

c# - 锁会造成线程堆积吗?/这是避免锁定的正确方法吗

c++ - 多个互斥锁策略以及为什么库不使用地址比较