【问题标题】:System.Reflection.Emit not supported in Unity project with Mono scripting backend具有 Mono 脚本后端的 Unity 项目不支持 System.Reflection.Emit
【发布时间】:2022-10-04 18:36:25
【问题描述】:

统一版本:2020.3.23f1

脚本后端:单核细胞增多症

API 兼容级别:.NET 4.x

播放器平台:Windows 独立

我正在尝试使用 GitHub 项目Python.NET (Python.Runtime.DLL),它的目标是.NET 标准 2.0和参考资料System.Reflection.Emit.

我已经导入了两个:

  1. Python.Runtime.dll
  2. System.Reflection.Emit.dll(.NET Standard 2.0 版本)

    ...到我的项目。

    我的理解是System.Reflection.Emitis not supported on Ahead-of-time (AOT) platforms/IL2CPP,但 Mono 后端应该没问题。

    然而,Python.运行时仍然抛出:

    PlatformNotSupportedException

    ...在任何电话System.Reflection.Emit.

    System.Reflection.Emit不再受支持,如果是这样,是否有可能的解决方法或我可以重建的方法Python.Runtime.dll从源头避免这个问题?

  • \"不再支持 System.Reflection.Emit\"- 不是 MS 仍然支持它(目前在 .NET 7 中与 Unity 无关)并且作为 .NET Framework 4.x 和 .NET Standard 2.1 的一部分,它与 Unity 兼容。 docs.unity3d.com/Manual/dotnetProfileSupport.html
  • 你在制作什么类型的游戏,对 Python 脚本有什么需求?你希望做什么样的事情?这会像 LUA 脚本在魔兽世界?我问的原因是反射发射是其中一种技术(另一种是代码DOM) 在 .NET 中,它允许您在运行时生成 .NET 二进制文件做任何事C# 开发人员可以在设计时编写。除非你有某种形式的 .NET 沙盒化这些曾经的 Python 脚本,否则现在 .NET 代码可能是恶意的!
  • \"我的理解是 AOT 平台/IL2CPP 不支持 System.Reflection.Emit,但 Mono 后端应该没问题\"- 是的,这是有道理的,因为 Unity 不能提前时间编译那些不存在的,如果它存在,我们就不需要 Python。 :)

标签: .net unity3d mono .net-standard-2.0


【解决方案1】:

好消息和坏消息。

坏消息

首先是坏消息。在对GitHub 进行了一些挖掘之后,我发现另一个用户也使用 Python.NET 和 Unity 2020.3(准确地说是 v..11 与 v..23f1)的this 问题:

我正在将 pythonnet 集成到 Unity 中,它似乎工作得很好。 但是,当我构建独立版本时,我得到了 PlatformNotSupportedException。 仔细一看,发现异常是由 Emit.DefineDynamicAssembly 触发的。 它如何在编辑器上工作而不是在独立版本中工作?1

电影人(撰写本文时的#3 贡献者)回复:

我们不能在这里提供支持,绝对不能为 Unity 提供支持。1

虽然看起来很黯淡,但这不是我们将听到的最后一个消息电影人...

好消息

菲尔莫拉继续说 Unity 有官方对 Unity 的支持!

现在也有官方支持 (https://docs.unity3d.com/Packages/com.unity.scripting.python@4.0/manual/index.html),它在后台使用 Python.NET。1, 2

回答您的其他问题

操作:

不再支持 System.Reflection.Emit

是的,它就是仍然由 MS 支持(目前在.NET 7不是与 Unity 相关的)并成为其中的一部分.NET 框架 4.x.NET 标准 2.1(.NET Core 3.0 库等效项)它也与 Unity 兼容(至少在理论上)。3

操作:

我的理解是 AOT 平台/IL2CPP 不支持 System.Reflection.Emit,但 Mono 后端应该没问题

是的,这是有道理的,因为 Unity不能 提前编译那些不存在的东西,如果它存在,我们就不需要 Python。 :)

关于在用户机器上运行时将 Python 转换为 .NET 的一句话


免责声明:我不是 Python 开发人员,在撰写本文时无法确定 Python 是否已预编译和/或需要进一步的 JIT 编译(如在 .NET 中)


我自己的一些问题:

  • 您正在制作什么类型的游戏以及对 Python 脚本的需求是什么?
  • 您希望做什么样的事情?
  • 这会像魔兽世界时代的 LUA 脚本吗?

我问的原因是反射发射是其中一种技术(另一种是代码DOM) 在 .NET 中,允许您生成 .NET 二进制文件在运行时能够做任何 C# 开发人员在设计时可以编写的东西。除非你有某种形式的 .NET 沙盒,这些曾经的 Python 脚本现在是 .NET 代码可能是恶意的!

沙盒是一个令人兴奋的主题,虽然对于游戏来说可能有点矫枉过正,但如果需要的话,还是值得研究的。我强烈推荐辉煌MSDN 杂志文章你相信它吗?探索使用 .NET Framework 2.0 安全托管不受信任的加载项的技术。不要让那个“.NET 框架 2.0”愚弄你,因为它仍然适用于 .NET Framework 4.x。4

否则,如果您想在游戏中支持脚本,请考虑托管类似 LUA 的语言(有点像 C),游戏玩家可以在其中编写模组来扩展您的游戏,而无需格式化硬盘。最近的 Unity 游戏风暴工厂did this

也可以看看

  1. 埃斯皮诺,M.“Emit:DefineDynamicAssembly 在 Unity Editor 中有效,但在 Unity Standalone 中无效”, 2021 年 7 月, https://github.com/pythonnet/pythonnet/issues/1492

  2. Python Scripting, 团结

  3. “.NET 配置文件支持”,团结,https://docs.unity3d.com/Manual/dotnetProfileSupport.html

  4. 法卡斯,S,“您信任它吗?探索使用 .NET Framework 2.0 安全托管不受信任的加载项的技术”,微软,2005 年,11 月版,https://docs.microsoft.com/en-us/archive/msdn-magazine/2005/november/how-to-safely-host-untrusted-add-ins-with-the-net-framework-2-0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多