我正在尝试在运行时从文本编译一个类。我的问题是我的班级在函数(AllLines)中使用valueTupe,并且收到错误“ C:\ xxxx.cs(19,28):错误CS0570:该语言不支持'BaseClass.AllLines'”使用此代码
CodeDomProvider objCodeCompiler = new Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider();
CompilerParameters objCompilerParameters = new CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add("mscorlib.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.IO.dll");
objCompilerParameters.ReferencedAssemblies.Add("System.Linq.dll");
CompilerResults objCompileResults = objCodeCompiler.CompileAssemblyFromFile(objCompilerParameters, filename);
编辑:
文本文件如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
namespace MyNamespace
{
public abstract class BaseClass
{
public List<(int LineNumber, string Value)> AllLines
{
...
}
}
}
我正在使用Microsoft.CodeDom.Providers.DotNetCompilerPlatform v2.0.0.0, Microsoft(R)Visual C#编译器版本1.0.0.50618
不确定这是否是roslyn的实际版本。
答案 0 :(得分:0)
我认为是因为您忘记了方法AllLines()
之后的括号:-)
答案 1 :(得分:0)
首先,您正确地使用了Roslyn,就像使用NuGet软件包Microsoft.CodeDom.Providers.DotNetCompilerPlatform中的Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider
一样。
但是,您面临的问题是您的文本文件不包含有效的C#。
List<T>
声明在将类型参数括在括号中无效List<T>
仅接受一个类型参数时,您将提供两个类型参数。 (也许您打算使用Dictionary<TKey, TValue>
)尝试将您的文本文件替换为:
using System;
using System.Collections.Generic;
using System.Linq;
namespace MyNamespace
{
public abstract class BaseClass
{
public Dictionary<int, string> AllLines
{
get; set;
}
}
}
请注意,此示例实际上不需要using System
或using System.Linq
。另请注意,您无需为此使用Roslyn。老式的CodeDOM可以对其进行编译(将Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider
替换为Microsoft.CSharp.CSharpCodeProvider
)。