无法在动态编译的代码中加载 System.ValueTuple
Can't load System.ValueTuple in dynamically compiled code
我想在 .net 4.6.1 上的动态编译代码中使用元组。
下面是一个最小的测试用例。任何帮助,将不胜感激。谢谢!
// 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");
}
}
}
浪费了一天时间,还是打不通
总是一样的错误,根本不识别元组。
顺便说一句,出于明显的安全原因,无法在在线代码中测试测试代码,需要本地环境。验证。
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:需要从 CompilerParameter.ReferencedAssemblies
中删除对 System.ValueTuple
的所有引用以避免多重引用错误。
您正在使用来自 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。也许 会帮助您升级到版本 7。
查看 this chart 框架版本与语言版本的关系。
我想在 .net 4.6.1 上的动态编译代码中使用元组。 下面是一个最小的测试用例。任何帮助,将不胜感激。谢谢!
// 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");
}
}
}
浪费了一天时间,还是打不通
总是一样的错误,根本不识别元组。
顺便说一句,出于明显的安全原因,无法在在线代码中测试测试代码,需要本地环境。验证。
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:需要从 CompilerParameter.ReferencedAssemblies
中删除对 System.ValueTuple
的所有引用以避免多重引用错误。
您正在使用来自 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 chart 框架版本与语言版本的关系。