【问题标题】:Compile multiple times the same .dll in runtime在运行时多次编译相同的 .dll
【发布时间】:2013-03-14 00:25:22
【问题描述】:

我正在开发一个简单的 2D 游戏编辑器,我希望能够从 .cs 文件中读取、编译然后将其附加到运行时的对象(如 Unity3D)并能够编辑其属性。

我现在正在将它们编译成 .dll 文件,问题是当我尝试再次重新编译它时,因为原始 .cs 文件也可以在运行时更新(它说该文件已被使用,因为.dll 已加载到我想的程序集中)

还有其他方法吗?

流程:

1 - 用户制作/编辑脚本(.cs 文件)
2 - 用户调用函数来编译脚本
3 - 程序编译所有 .cs 文件并更新 .DLL 文件。

谢谢。

【问题讨论】:

  • 我认为您尝试做的事情是不可能的,或者至少不切实际。这也有助于展示您尝试过的内容,因为您正在尝试做一些不典型的事情。通常你会停止你的程序然后重新编译。
  • 我同意你的观点,这可能不是很实用,但可以实现(Unity3D引擎使用它)并且在开发游戏时这是一个很大的改进。

标签: c# serialization compiler-construction


【解决方案1】:

与其将 DLL 链接到您的项目,不如考虑使用 LoadLibrary() 或 LoadLibraryEx() 在调用其任何函数之前(以及在执行任何重新编译之后)加载它,然后在执行之前调用 FreeLibrary()你重新编译。

【讨论】:

  • 感谢您的回复 RobH,您能告诉我如何使用 LoadLibrary/Ex() 将那些已编译的类型加载到程序中吗?
  • LoadLibrary() 记录在 here。 (您可以找到其他两个函数的链接,以及那里的相关函数。)当您链接您的项目时,不要将 DLL 的 .lib 文件链接到其中,因为 LoadLibrary/Ex() 会完成这项工作。 (不过,您仍然必须#include 标头。)当然,如果用户在标头中进行了更改(例如更改 API),那么您就不走运了,因为您'将不得不重新编译您的项目,这当然需要先将其关闭。
  • 谢谢,我能够加载程序集并在必要时释放它。我现在只有一个问题。如何找到加载程序集的类型?我想向用户显示 LoadLibrary() 加载的程序集中可用的类型。再次感谢您的支持;)
  • 我认为我可以使用 Shadow Copying 解决这个问题,我会尝试稍后再说;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多