如何使用 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 框架为目标?的主要内容,如果未能解决你的问题,请参考以下文章