如何配置Visual Studio 2019匹配Mono DMCS 4.6.2编译环境?
解决VS2019与Mono DMCS 4.6.2环境匹配的问题
嘿,这个场景我太熟悉了——本地VS跑代码顺得不行,一提交到老版本Mono环境就一堆编译错误,核心问题就是VS默认的配置(C#版本、目标框架)和Mono DMCS 4.6.2的支持范围不匹配,再加上代码里用了老版本不支持的新语法。咱们一步步来搞定:
第一步:配置VS2019匹配Mono 4.6.2的环境
Mono 4.6.2对应的是.NET Framework 4.6.1,并且它的DMCS编译器只支持到C# 6,所以要把VS的配置往下调:
- 设置目标框架:右键你的项目 → 属性 → 应用程序 → 目标框架,选择
.NET Framework 4.6.1(比你选的.NET 4更贴合Mono 4.6.2的支持范围)。 - 强制C#语言版本为6:右键项目 → 属性 → 生成 → 高级 → 语言版本,选择
C# 6(VS2019默认会用更高版本,而Mono 4.6.2不支持C# 7+的特性)。 - 匹配编译参数:
- 勾选“优化代码”(对应Mono的
-optimize+参数):在项目属性的“生成”标签页里,勾选“优化代码”选项。 - 引用
System.Numerics:右键项目的“引用” → 添加引用 → 找到System.Numerics并勾选,确保编译时包含这个依赖。
- 勾选“优化代码”(对应Mono的
第二步:修改代码适配C# 6(关键!)
你的代码里用了局部函数(就是在Main方法里定义的CLEAR、SET、OR、AND这些函数),这是C# 7才引入的特性,而Mono 4.6.2的DMCS根本不支持,这就是编译报错的核心原因!
把这些局部函数改成类的私有静态方法,调整后的代码如下:
using System; using System.Collections.Generic; namespace capgemini_kattis { class Program { // 把需要共享的charArray改成类级别的静态字段 private static char[] charArray; // 把原来的局部函数移到类里,改成静态方法 private static void CLEAR(int i) { charArray[i] = '0'; } private static void SET(int i) { charArray[i] = '1'; } private static void OR(int i, int j) { if (charArray[i] == '1' || charArray[j] == '1') { charArray[i] = '1'; } else if (charArray[i] == '0' && charArray[j] == '0') { charArray[i] = '0'; } else { charArray[i] = '?'; } } private static void AND(int i, int j) { if (charArray[i] == '1' && charArray[j] == '1') { charArray[i] = '1'; } else if (charArray[i] == '0' || charArray[j] == '0') { charArray[i] = '0'; } else { charArray[i] = '?'; } } static void Main(string[] args) { /* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Task 2 */ bool isNumberOfCommandsRead = false; List<string> answer = new List<string>(); string input = "????????????????????????????????"; // 初始化类级别的charArray charArray = input.ToCharArray(); int numberOfCommands = 0; string line; while ((line = Console.ReadLine()) != null) { if (!isNumberOfCommandsRead) { numberOfCommands = Convert.ToInt32(line.Trim()); isNumberOfCommandsRead = true; if (numberOfCommands == 0) { break; } } else { string[] split = line.Split(new char[] { ' ' }, StringSplitOptions.None); switch (split[0].Trim().ToUpper()) { case "CLEAR": CLEAR(Convert.ToInt32(split[1].Trim())); numberOfCommands--; break; case "SET": SET(Convert.ToInt32(split[1].Trim())); numberOfCommands--; break; case "OR": OR(Convert.ToInt32(split[1].Trim()), Convert.ToInt32(split[2].Trim())); numberOfCommands--; break; case "AND": AND(Convert.ToInt32(split[1].Trim()), Convert.ToInt32(split[2].Trim())); numberOfCommands--; break; } if (numberOfCommands == 0) { Array.Reverse(charArray); string sectionResult = new string(charArray); answer.Add(sectionResult); // 重置charArray charArray = input.ToCharArray(); isNumberOfCommandsRead = false; } } } foreach (string s in answer) { Console.WriteLine(s); } Console.ReadLine(); } } }
另外我还优化了一处:原来的sectionResult循环拼接可以直接用new string(charArray),比循环拼接更高效,也避免了冗余代码。
第三步:验证配置
配置完VS并修改代码后,你可以手动用Mono的DMCS命令测试编译:
打开命令行,切换到代码所在目录,运行:
dmcs -optimize+ -r:System.Numerics Program.cs
如果编译通过,说明配置和代码都没问题了,提交到在线测试环境应该就能正常运行。
内容的提问来源于stack exchange,提问作者Tosh
相关产品推荐
相关产品推荐

