Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
逐步使用Roslyn C#编译器_C#_Roslyn - Fatal编程技术网

逐步使用Roslyn C#编译器

逐步使用Roslyn C#编译器,c#,roslyn,C#,Roslyn,我已经建立了Roslyn源代码 我想在C#编译器中添加一个断点,并逐步完成这个简单程序的编译: using System; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { var result = 1 + 2; Console.WriteLine(result); }

我已经建立了Roslyn源代码

我想在C#编译器中添加一个断点,并逐步完成这个简单程序的编译:

using System;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var result = 1 + 2;

            Console.WriteLine(result);
        }
    }
}
我应该在哪里设置断点?它应该在编译过程的早期,因为我想逐步完成解析甚至词法分析


如果我将CompilerExtension设置为启动项目并点击F5(开始调试),则会启动一个运行新构建的编译器的Visual Studio副本。我希望避免每次我希望逐步完成编译器时都必须启动Visual Studio的新实例。设置一个直接调用上述源代码上的编译器代码的小程序的好方法是什么?

下面是Josh在上面的评论中建议的一种方法

  • 向Roslyn解决方案添加新的“控制台应用程序”项目

  • 将以下两个引用添加到项目中:

测试解析器的简单程序:

using Microsoft.CodeAnalysis.CSharp;

namespace TestCompiler
{
    class Program
    {
        static void Main(string[] args)
        {
            var program_text = @"

                using System;

                namespace ConsoleApplication2
                {
                    class Program
                    {
                        static void Main(string[] args) 
                        { var result = 2 + 3; Console.WriteLine(result); }
                    }
                }
            ";

            var result = CSharpSyntaxTree.ParseText(program_text);
        }
    }
}
  • 在调用
    ParseText
    的行中添加断点

  • “开始调试”并进入该行深入研究解析器

通过
Emit
测试编译器的简单程序:

using System;
using System.IO;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;

namespace TestCompiler
{
    class Program
    {
        static void Main(string[] args)
        {
            var program_text = @"

                using System;

                namespace ConsoleApplication2
                {
                    class Program
                    {
                        static void Main(string[] args) 
                        { var result = 2 + 3; Console.WriteLine(result); }
                    }
                }
            ";

            var syntax_tree = CSharpSyntaxTree.ParseText(program_text);

            var compilation = CSharpCompilation.Create(
                Guid.NewGuid().ToString("D"),
                new[] { syntax_tree },
                new[] { MetadataReference.CreateFromFile(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\mscorlib.dll") });

            var emit_result = compilation.Emit(new MemoryStream());
        }
    }
}

如果你想要一个调用编译器的简单程序,只要考虑使用CSC作为你的启动项目。您可以从项目的调试设置中指定要传递的参数(如源文件)。

您可以向Roslyn解决方案添加新项目,添加对正确的Microsoft.CodeAnalysis项目的引用,然后调用
CSharpSyntaxTree.ParseText()
Compilation.Emit()
。然后,您可以逐步完成您感兴趣的解析或发出代码。谢谢Josh!我添加了一个答案,演示了
ParseText
@JoshVarty根据@JoshVarty在这里和他的一篇博客文章中的建议写了一篇博客文章。这可能会引起任何想和Roslyn玩的人的兴趣。谢谢你,杰森!我目前正在探索Josh在上面的评论中提到的方法。到目前为止,它似乎运作良好。我添加了一个描述这种方法的答案。这似乎是在VisualStudio调试器下测试Roslyn编译器的合乎逻辑的方法。但是csc.exe有很多可能的参数。您是否有关于需要哪些参数以及使用哪些附加参数的链接或建议?对于当前版本的Roslyn和Visual Studio 2017,您还需要添加对System.Reflection.Metadata的NuGet包的引用,版本=1.4.2。直到我确定(花了我很长时间)我得到了“应用程序处于中断模式”,并且根本无法做任何事情。这可能是由于Visual Studio中的一个bug导致的。当我双击生成的.exe文件时,最终提供了真正问题的线索,然后在控制台窗口中出现了一个错误。