gpt4 book ai didi

c# - 如何以编程方式使用 Roslyn 编译 C# 文件?

转载 作者:IT王子 更新时间:2023-10-29 04:14:28 26 4
gpt4 key购买 nike

我读到您无法使用 CSharpCodeProvider 编译 C# 6.0,因此尝试使用 Roslyn。但是我找不到如何加载文件然后将其编译为 dll 的好示例。

我应该如何使用 Roslyn 编写类似于此代码的内容?或者还有其他方法吗?现在,当我尝试使用 C# 6.0 代码编译包含对项目的引用的文件时,它只是说“类型或命名空间名称‘x’在命名空间‘y’中不存在(您是否缺少程序集引用?)”

    public string CompileCode()
{
var provider = new CSharpCodeProvider();
var outputPath = Path.Combine(Path.GetDirectoryName(_path), $"Code.dll");
var compilerparams = new CompilerParameters(_referencedAssemblies, outputPath);
CompilerResults results = provider.CompileAssemblyFromFile(compilerparams, _path);
var dllPath = results.PathToAssembly;
if (!results.Errors.HasErrors)
return dllPath;
PrintError(results.Errors);
return "";
}

总而言之,我想:

  • 加载 C# 文件
  • 将其编译为 dll,以便稍后加载。

最佳答案

我已经创建了一个示例供您使用。您需要调整它以使用 .Net 4.6 的运行时,以便您可以使用 CSharp6 版本。我添加了一些细节,以便您可以选择编译选项。

需要更改 -将运行时路径更改为目标 .Net 4.6在下面的示例中将 LanguageVersion.Csharp5 更改为 LanguageVersion.Csharp6

 class Program
{
private static readonly IEnumerable<string> DefaultNamespaces =
new[]
{
"System",
"System.IO",
"System.Net",
"System.Linq",
"System.Text",
"System.Text.RegularExpressions",
"System.Collections.Generic"
};

private static string runtimePath = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\{0}.dll";

private static readonly IEnumerable<MetadataReference> DefaultReferences =
new[]
{
MetadataReference.CreateFromFile(string.Format(runtimePath, "mscorlib")),
MetadataReference.CreateFromFile(string.Format(runtimePath, "System")),
MetadataReference.CreateFromFile(string.Format(runtimePath, "System.Core"))
};

private static readonly CSharpCompilationOptions DefaultCompilationOptions =
new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
.WithOverflowChecks(true).WithOptimizationLevel(OptimizationLevel.Release)
.WithUsings(DefaultNamespaces);

public static SyntaxTree Parse(string text, string filename = "", CSharpParseOptions options = null)
{
var stringText = SourceText.From(text, Encoding.UTF8);
return SyntaxFactory.ParseSyntaxTree(stringText, options, filename);
}

static void Main(string[] args)
{
var fileToCompile = @"C:\Users\DesktopHome\Documents\Visual Studio 2013\Projects\ConsoleForEverything\SignalR_Everything\Program.cs";
var source = File.ReadAllText(fileToCompile);
var parsedSyntaxTree = Parse(source, "", CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp5));

var compilation
= CSharpCompilation.Create("Test.dll", new SyntaxTree[] { parsedSyntaxTree }, DefaultReferences, DefaultCompilationOptions);
try
{
var result = compilation.Emit(@"c:\temp\Test.dll");

Console.WriteLine(result.Success ? "Sucess!!" : "Failed");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Console.Read();
}

这需要稍作调整,但它应该会为您提供所需的结果。根据需要更改它。

关于c# - 如何以编程方式使用 Roslyn 编译 C# 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32769630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com