0

我正在尝试在运行时从文本编译一个类。我的问题是我的类在函数 (AllLines) 中使用了 valueTupe,当我收到错误“C:\xxxx.cs(19,28): error CS0570: 'BaseClass.AllLines' is not supported by the language”时使用此代码

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# Compiler version 1.0.0.50618

不确定这是否是 roslyn 的实际版本。

4

1 回答 1

0

首先,您在使用Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProviderNuGet 包Microsoft.CodeDom.Providers.DotNetCompilerPlatform时使用 Roslyn 是正确的。

但是,您面临的问题是您的文本文件不包含有效的 C#。

  1. 您的声明List<T>在括号中包含类型参数时无效
  2. 您正在将名称(?)添加到类型参数声明(LineNumber,Value)中。
  3. List<T>当只接受一个时,您提供了两个类型参数。(也许您打算使用 a Dictionary<TKey, TValue>
  4. 您的财产声明没有正文

尝试将您的文本文件替换为:

using System;
using System.Collections.Generic;
using System.Linq;
namespace MyNamespace
{
    public abstract class BaseClass
    {
        public Dictionary<int, string> AllLines
        {
            get; set;
        }
    }
}

请注意,对于此示例,您实际上并不需要using Systemor 。using System.Linq另请注意,您不需要为此使用 Roslyn。老式的 CodeDOM 可以编译它(替换Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProviderMicrosoft.CSharp.CSharpCodeProvider)。

于 2018-07-05T11:59:25.827 回答