在C#中动态重新加载类(在所有实例中循环)

在C#中动态重新加载类(在所有实例中循环),c#,game-engine,C#,Game Engine,我正在用C#构建一个游戏引擎,我的目标是能够动态编辑和重新加载同样用C#编写的组件类。从我通过几个不同的例子发现,确实可以将程序集(DLL)加载到AppDomain中,然后卸载它并重新加载编辑/重新编译的版本。通过我自己的测试,我发现它工作得非常好,剩下的唯一问题是消除了对该对象特定实例的所有运行时引用,以便可以重新加载和替换它 基本上,我希望能够得到一个特定对象的所有引用的列表。我知道这在C#中可能是完全不可能的,因为它在很大程度上依赖于存储引用特定对象的所有对象列表的语言。只要它工作正常,实

我正在用C#构建一个游戏引擎,我的目标是能够动态编辑和重新加载同样用C#编写的组件类。从我通过几个不同的例子发现,确实可以将程序集(DLL)加载到AppDomain中,然后卸载它并重新加载编辑/重新编译的版本。通过我自己的测试,我发现它工作得非常好,剩下的唯一问题是消除了对该对象特定实例的所有运行时引用,以便可以重新加载和替换它

基本上,我希望能够得到一个特定对象的所有引用的列表。我知道这在C#中可能是完全不可能的,因为它在很大程度上依赖于存储引用特定对象的所有对象列表的语言。只要它工作正常,实现速度是否慢到令人难以置信并不重要

我在这里粘贴了一些伪代码,以实现我想要的功能:

我知道有一种方法可以做到这一点,那就是拥有我自己的“弱引用”类型,我基本上在任何地方都使用它,并且从不创建对对象的直接引用。这看起来有点头疼,但如果仍然存在对对象的任何真实引用,卸载AppDomain至少会引发异常。基本上,这把管理权交给了我,而不是自动的和可执行的


如果你知道一个很好的方法,或者你认为我在做一些根本错误的事情,请随时说出来,谢谢

WeakReference已存在。这是个不错的主意

另外,要以类似“插件”的方式加载.dll,请查看MEF。它为你们抽象了很多工作


如果您还没有签出它,那么您真的应该看看。它将为您节省大量时间,而不是重新发明轮子。

如果您自己管理它,请记住,整个AppDomain的所有引用都将通过代理引用,而不是实际指向实例。为了生成代理,所有封送实例也必须从MarshallByRefObject派生

您可以使用的一个选项是组织游戏,以便几乎整个游戏都在一个AppDomain中,而主AppDomain是一个相对较浅的托管shell。这可以最大限度地减少在游戏实际运行时进行的跨AppDomain调用的数量,而这往往会很慢。要重新加载加载项,请执行以下操作:

  • 使用DataContractSerializer之类可以维护引用的东西序列化游戏状态
  • 卸载整个游戏AppDomain
  • 加载新游戏AppDomain
  • 反序列化你的游戏状态,现在在重建它们时将解析为新加载的类型

似乎他们也在构建composition对象时考虑了基于组件的设计。。。有趣。我将在PC上进行所有的编辑、测试和播放,然而,核心组件架构需要在.NETXNA框架下的XBox上编译;MEF可能无法在XBox上运行:/Works在WinPho7中运行,所以如果您无法在XBox下运行,我会感到惊讶。太棒了!这肯定是一个永远留在我工具箱里的工具。