【问题标题】:Compiling C# via Unity3D and MonoDevelop通过 Unity3D 和 MonoDevelop 编译 C#
【发布时间】:2014-03-25 16:32:56
【问题描述】:

我正在使用 Unity3D v4.2.2f1,它附带的 MonoDevelop 版本 - v2.8.2。

我发现在某些情况下 C# 代码可以在 Unity3D 中编译,但在 MonoDevelop 中则不行。例如,Unity3D 接受方法参数的默认值,但在 MonoDevelop 中导致“不允许默认参数设置 (CS0241)”。

我在网上找到的一般建议是不要尝试从 MonoDevelop 编译。很好 - 但我很想了解这种不匹配是如何产生的。我认为 Unity3D 和 MonoDevelop 都使用 Mono 编译 C#?是不是Unity3D自带了两个版本的Mono,一个给自己,一个给MonoDevelop?如果有,为什么?

在 Unity 中编译但在 MonoDevelop 中不编译的方法的第一行示例(在 MonoDevelop 中不编译但从 Unity3D 编译的位是对 setNative 的 '=false' 赋值):

public static void SetUnityVersion(string path, bool setNative=false) {
    ...implementation...
}

【问题讨论】:

  • 我在非常罕见的情况下也观察到了低于 3.5 的情况。可以给个代码sn-p吗?
  • 见上文 - 更新问题。
  • 我刚刚试用了您在 Unity 3.4.3f1 (Mono 4.0.1) 中提供的代码,它编译得很好。如果我没记错的话,我的问题与代表们提到自己有关。
  • 完全正确 - Unity 可以很好地编译它(可能使用某些版本的 Mono)。问题是尝试从 MonoDEVELOP 编译时...
  • 不,抱歉我说得不准确:我是在 MonoDevelop 4.0.1 中完成的,而在 Unity 中不是。我也用 2.8.2 检查了它,它编译时没有任何抱怨。也许您的项目设置有问题。我会开始一个新的 Unity 项目,打开 Mono,添加一个脚本,然后查看它是否编译。如果不是 => 重新安装,如果是,那就是别的东西。顺便说一句,方法原型是什么意思? C# 不支持动态添加方法,如 JavaScript,只支持扩展方法。

标签: c# compiler-construction mono unity3d monodevelop


【解决方案1】:

在 Windows 上与 Unity 一起安装时,MonoDevelop 默认使用 Microsoft .Net Framework。正如here 所指出的,Unity 使用“Mono 的自定义构建”。

导致编译器错误的语言功能称为Optional parameters,并在C# 4.0 中引入。现在,Unity 生成的 MonoDevelop 项目针对.Net Framework 3.5,不支持此功能。

如果您将生成项目的目标框架更改为.Net 4.0(在 Monodevelop 中右键单击项目,然后单击options->general->Target Framework),一切都应该编译正常。但是如果您在 Unity 中对项目进行任何更改(例如添加脚本),MonoDevelop 项目文件将重新生成并且您的更改将丢失。

要解决此问题,您可以下载并安装 Mono for Windows 的发行版,然后将其配置为 MonoDevelop 中的默认运行时(Tools->Options->.Net Runtimes->Add,找到已安装的 Mono 发行版,然后点击 Set as Default)。 Monodevelop 现在将使用Mono 编译您的代码,Mono 编译器不会抱怨默认参数值。

这应该可以省去你在 Unity 和 MonoDevelop 之间切换的麻烦,只是为了检查代码是否可以编译。使用 Unity 4.5.3f3 和 MonoDevelop 4.0.1 测试。

【讨论】:

    猜你喜欢
    • 2012-02-17
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多