c# – 在.NET中重新加载程序集而不创建新的AppDomain
我正在使用C#编写游戏引擎编辑器.这个想法是用户将所有游戏代码写入编辑器将加载的项目中,因此它可以列出用户定义的类,并在场景编辑器中实例化它们.
使用(重新)加载DLL的概念,我可以加载DLL,实例化和调用外部程序集中定义的类的方法,重建外部程序集,并在主机中再次加载它,而无需重新启动主机.这项工作(至少看起来像它),但它不会释放以前加载的程序集的内存. 装载机类: public class Loader { // This DLL contains an implementation of ILoadable - ILoadable is declared in a shared project. private const string AsmPath = @"D:DevAsmLoadingAsmLoadingImplbinDebugAsmLoadingImpl.dll"; public ILoadable GetExternalLoadable() { var asmBytes = File.ReadAllBytes(AsmPath); Assembly asm = Assembly.Load(asmBytes,null); var loadableInterface = typeof(ILoadable); var loadableImpl = asm.GetTypes().First(loadableInterface.IsAssignableFrom); return (ILoadable)Activator.CreateInstance(loadableImpl); } } 运行GetExternalLoadable()2或3次,任务管理器显示我的宿主程序中RAM使用量增加约1mb,重复相同的操作将进一步增加它,而不会减少. 有什么方法可以解决这个问题吗?我知道Unity正在做类似的事情,除了它们实际上自己编译外部程序集,但是当我触发重新编译几次时,Unity编辑器不会消耗额外的内存. 所以,我想要完成的是外部装配的“实时重装”. 解决方法
.NET 4增加了对
collectible assemblies的支持,可以由GC卸载.
但是,这些受到严格限制: >它们用于动态代码生成,您不能只加载.dll文件 如果你有一个遵循这些限制的.dll,你可能能够加载并重新发出IL代码,使它看起来像是一个动态生成的.NET程序集. 除了动态方法和可收集的程序集之外,在不卸载整个AppDomain的情况下卸载代码是不可能的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- CoreData NSPredicate 查询、搜索
- ruby-on-rails-4 – Rails 4 I18n:在关联验证消
- ruby-on-rails – Paperclip,fog.io和Rackspace
- 使用本机/托管环境将无注册COM清单嵌入到C#dll中
- c# – UWP显示全屏弹出,ContentDialog或弹出窗口
- c# – 动态String.Format取决于params
- 同伴之间的C友谊健康吗?
- iphone – Xcode 4 Preview 4显示“Build Succee
- ruby-on-rails – 如何从heroku上的github中提取
- Oracle PL / SQL代码约定