【问题标题】:Unity Error: .ctor(): method body is emptyUnity 错误:.ctor():方法主体为空
【发布时间】:2019-02-14 21:01:51
【问题描述】:

这是一个后续问题,来自my last question,关于如何从流中读取和写入。以下代码是那里的最佳答案:

    var byteData = Encoding.UTF8.GetBytes(data);

    var saveFileDialog = new SaveFileDialog
    {
        DefaultExt = "json",
        AddExtension = true,
        Filter = "JSON|*.json"
    };

    if (saveFileDialog.ShowDialog() != DialogResult.OK ||
        string.IsNullOrEmpty(saveFileDialog.FileName)) return;

    using (var saveFileDialogStream = saveFileDialog.OpenFile())
    {
        saveFileDialogStream.Write(byteData, 0, byteData.Length);
    }

给我这个的人确认它可以在 Unity 之外运行,但是当我尝试让它通过 Unity 运行时,它会引发以下错误:

InvalidProgramException:System.Forms.SaveFileDialog 中的 IL 代码无效:.ctor ():方法体为空

有什么想法吗?如果您想了解更多详细信息,请询问。我会尽力充实我的问题。

编辑

似乎修复了第一个错误,但这发现了第二个错误,与上面看到的 if 语句存在问题:

NullReferenceException:对象引用未设置为对象的实例

【问题讨论】:

  • answers.unity.com/answers/406235/view.html -- 可能与您的问题有关。
  • @Chris 通过我确实找到了似乎是一个解决方案,但我现在遇到了第二个错误,即与上述代码 sn-p 中的 if 语句相关的 NullReferenceException。知道是什么原因造成的吗?
  • 那么,您是如何解决第一个问题的?我的猜测是你所做的任何事情都会导致 saveFileDialog 成为 null
  • 我重新导入了 System.Windows.Forms.dll,但我从 'C:\Program Files\Unity\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api' 而不是 'C :\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client',所以可能是 api 版本的不同?

标签: c# unity3d .net-3.5 savefiledialog


【解决方案1】:

SaveFileDialog 类需要 .NET Framework 1.1 或更高版本才能运行,正如您在原始帖子中 documentation you have linked to 的最后一页所指出的那样。

.NET Framework 是 .NET 环境中提供的几个运行时之一。问题是:Unity 不使用 .NET Framework 作为其主要运行时 - 它使用 Mono,它是 .NET 运行时的轻量级和可移植版本,旨在在多个环境中运行平台。这就是 Unity 能够在 iOS、Android、PC、macOS 等中执行 .NET/C# 代码的方式。

因此,基本上你不能在 Unity 中使用 SaveFileDialog 类而不使用插件,这些插件提供特定于平台的用于保存文件的对话框的实现。您必须编写一个可以访问该类的插件,即使那样,它也只能在基于 Windows 的平台上执行,因为 .NET Framework 是一个特定于 Windows 的 .NET 运行时 .

【讨论】:

  • 谢谢,那我再找个替代品。
  • EditorUtility.SaveFilePanel 不是用来在 Unity 中保存文件的吗?
  • OP 你应该看看@DStanley 建议的这个方法,以显示在 Unity 中运行的“保存文件对话框”。唯一的缺点是 EditorUtility 是 UnityEditor 程序集的一部分,当您为应用程序/游戏生成最终可执行文件时,它不会被编译。这意味着它只能在 UnityEditor 中运行,而不是在最终游戏的可执行文件中。如果您正在创建只能在 Unity3D 编辑器中运行的脚本,那么这绝对是一个很棒的(且可移植的)解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 2022-11-11
  • 2016-11-28
  • 2015-09-13
相关资源
最近更新 更多