无法在动态编译的代码中加载 System.ValueTuple

问题描述

我想在 .net 4.6.1 上动态编译的代码中使用 Tuple。 下面是一个最小的测试用例。任何帮助,将不胜感激。谢谢!

// First,install System.ValueTuple 4.5 package via nuget into test Project.
using System;
using System.CodeDom.Compiler;

public class Program
{
    public static void Main()
    {
        string source = @"
using System;
namespace TupleTest {
    class TupleTest {
        public void test(){
            (int key,string value) tuple1 = (1,""ok"");
        }
    }
}";
        var cp = new CompilerParameters();
        cp.GenerateExecutable = false;
        cp.GenerateInMemory = true;
        cp.IncludeDebugInformation = false;
        // cp.IncludeDebugInformation = true;
        cp.WarningLevel = 1;
        cp.TreatWarningsAsErrors = true;
        cp.ReferencedAssemblies.Add("System.dll");
        cp.ReferencedAssemblies.Add("System.ValueTuple.dll");
        var compiler = Microsoft.CSharp.CSharpCodeProvider.CreateProvider("CSharp");
        var compilerResults = compiler.CompileAssemblyFromSource(cp,source);

        if (compilerResults.Errors.HasErrors)
        {
            Console.WriteLine("Compile Failed: ");
            foreach (var error in compilerResults.Errors)
                Console.WriteLine("Line {0},Column {1}: error {2}: {3}",error.Line,error.Column,error.ErrorNumber,error.ErrorText);
        }
        else
        {
            Console.WriteLine("Compile Pass");
        }
    }
}

浪费了一天,还是打不通。

总是同样的错误,它根本无法识别元组。

顺便说一句,出于明显的安全原因,测试代码不能在在线 codefddling 中进行测试,需要一个本地环境。验证。

Line 6,column 37: error CS1003: Syntax error,'=>' expected
Line 6,column 47: error CS1026: ) expected
Line 6,column 47: error CS1525: Invalid expression term ','
Line 6,column 49: error CS1002: ; expected
Line 6,column 53: error CS1002: ; expected
Line 6,column 53: error CS1525: Invalid expression term ')'

还尝试替换 cp.ReferencedAssemblies.Add("System.ValueTuple.dll");cp.ReferencedAssemblies.Add("C:\\nugetpkg\\System.ValueTuple.dll"); , 徒劳无功。 Aslo双加给

Line 0,column 0: error CS1703: 
An assembly with the same identity 'System.ValueTuple,Version=4.0.3.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51' 
has already been imported. Try removing one of the duplicate references.

感谢您的帮助。使用答案中提到的基于 roslyn 的编译器解决。 PS:所有对 System.ValueTuple 的引用都需要从 CompilerParameter.ReferencedAssemblies 中删除,以避免多次引用错误。

解决方法

您正在使用来自 C# later version 的语言功能。如果你这样做:

        string source = @"
using System;
namespace TupleTest {
    class TupleTest {
        public void test(){
            var tuple1 = ValueTuple.Create(1,""ok"");
            Console.WriteLine(tuple1.Item2);
        }
    }
}";

然后编译就好了。

我很确定 CSharpCodeProvider 仅适用于 C# 语言的第 5 或 6 版。也许 this answer 会帮助您升级到第 7 版。

查看this chart,了解框架版本与语言版本之间的关系。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...