如何使用 C# 4.0 编译器让 MonoDevelop 以 .NET 2.0 框架为目标?

Posted

技术标签:

【中文标题】如何使用 C# 4.0 编译器让 MonoDevelop 以 .NET 2.0 框架为目标?【英文标题】:How to get MonoDevelop to target .NET 2.0 framework with C# 4.0 compiler? 【发布时间】:2012-08-25 02:41:53 【问题描述】:

这很容易使用 Visual Studio 实现,但我需要使用 MonoDevelop 来实现这一点,因为 Visual Studio 编译的 DLL 不能很好地与 Unity 配合使用。 MonoDevelop DLL 工作正常,但我想在针对 .NET 2.0 运行时使用默认函数参数(C# 4.0 功能)。

MonoDevelop 可以做到这一点吗?我该如何设置?

添加:为 Visual Studio 和 MonoDevelop 构建命令行

我对参数进行了排序以便于比较:

MonoDevelop:目标 = Mono / .NET 4

C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe
/noconfig
/warn:4
"/define:TRACE"
/optimize+
"/out:C:\TestLibraries\TestEditor\bin\Release\TestEditor.dll"
/t:library

/nologo

"/r:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll"
"/r:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Core.dll"
"/r:C:\Program Files (x86)\Unity\Editor\Data\Managed\UnityEditor.dll"
"/r:C:\Program Files (x86)\Unity\Editor\Data\Managed\UnityEngine.dll"

/fullpaths
/utf8output

MonoDevelop:Target = Mono / .NET 3.5(第一个有趣的)

C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe
/warn:4
"/define:TRACE"
/optimize+
"/out:C:\TestLibraries\TestEditor\bin\Release\TestEditor.dll"
/t:library

/nologo
-nostdlib

"/r:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll"
"/r:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll"
"/r:C:\Program Files (x86)\Unity\Editor\Data\Managed\UnityEditor.dll"
"/r:C:\Program Files (x86)\Unity\Editor\Data\Managed\UnityEngine.dll"

/fullpaths
/utf8output

Visual Studio:目标 = .NET 4

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe
/noconfig
/nowarn:1701,1702
/warn:4
/define:TRACE
/optimize+
/out:obj\Release\TestEditor.dll
/target:library

/nostdlib+ /errorreport:prompt

/reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\mscorlib.dll"
/reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Core.dll"
/reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll"
/reference:"C:\Program Files (x86)\Unity\Editor\Data\Managed\UnityEngine.dll"

/debug:pdbonly
/filealign:512

Visual Studio : Target = .NET 3.5(第二个有趣的)

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe
/noconfig
/nowarn:1701,1702
/warn:4
/define:TRACE
/optimize+
/out:obj\Release\TestEditor.dll
/target:library

/nostdlib+ /errorreport:prompt

/reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll
/reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll"
/reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll
/reference:"C:\Program Files (x86)\Unity\Editor\Data\Managed\UnityEngine.dll"

/debug:pdbonly
/filealign:512

【问题讨论】:

【参考方案1】:

最新的稳定 Mono 版本 (2.10.9) 附带的 2.0 C# 编译器 (mcs/gmcs) 支持默认函数参数。刚刚新建了一个控制台项目,把目标框架改成2.0,编译默认函数参数成功。

【讨论】:

在 Windows 上,Mono 似乎以与 Visual Studio 不同的方式使用 Microsoft C# 编译器。有没有办法强制它使用 Mono 的? 相信你可以在 MonoDevelop 的 Preferences/.NET Runtimes 中选择。【参考方案2】:

这里有两个问题:

Q1) 如何使用当前的 MonoDevelop 构建与 .Net 2.0 兼容的 .dll 或 .exe?

A:我不知道你是否可以。一种解决方法是下载并安装 MonoDevelop 2.4.x。

Q2) 我想要 C# 4.0 默认函数参数,但我想针对 .Net 2.0

答:你不能 :) 如果你想以 .Net 2.0 为目标,那么你需要使用与 .Net 2.0 兼容的 C# 语言特性的子集。如果您想使用 C# 4.0 语言功能,那么您可能至少需要 一些 .Net 4.0 库...这实际上意味着您将需要 .Net 4.0。 p>

【讨论】:

我对此知之甚少,但我阅读了几个 *** 的答案,在 Visual Studio 中这是可能的,因为默认参数只是 C# 4 的语言功能,并且可以使用 . NET 2.0 感谢 在这种情况下,“语言”通常与 .Net 运行时密切相关。有两个问题:1) 可能需要哪些(可能是新的、不兼容的).Net 程序集,以及编译器将为给定的语言特性生成什么(可能是新的、不兼容的)字节码。您可以掷骰子……但有多种输球方式。 :( 这个链接更详细地解释了后一个问题:Common Intermediate Language Infrastructure 经过额外的实验,我发现 Visual Studio 总是使用 .NET 4 框架中的最新 C# 编译器,即使目标框架设置为“3.5”,它也只是假定指定的框架。 MonoDevelop 使用指定的框架,但它也使用来自指定框架的 C# 编译器。我将使用 VC 和 MD 使用的命令行来修改我的问题。

以上是关于如何使用 C# 4.0 编译器让 MonoDevelop 以 .NET 2.0 框架为目标?的主要内容,如果未能解决你的问题,请参考以下文章

c# 4.0 如何给图像添加图层

C# 4.0 编译时图灵是不是完整?

C# 4.0中的动态类型和动态编程

如何区分 C# 4.0 中的硬盘型号

C# 4.0:我可以使用 TimeSpan 作为具有默认值的可选参数吗?

您如何使用 c# 4.0 app.config 中的部分?