160517 roslyn C# 컴파일 API 테스트

Edit

roslyn 추가

  • nuget package manager로 추가
PM> Install-Package Microsoft.CodeAnalysis -Pre




소스코드를 로드후, 네임스페이스, 클래스, 속성, 메소드 분석

/// <summary>
/// 소스코드를 로드
/// CSharpSyntaxTree 로 구조화
/// 네임스페이스, 클래스, 속성, 메소드를 차례로 순환하며 분석
/// </summary>
private static void _PrintNsClassPropMethod()
{
    // CSharpSyntaxTree로 소스코드 파싱
    var tree = CSharpSyntaxTree.ParseText(
@"
    namespace NS1
    { 
        class Class1
        { 
            public int ID { get; set; }
            public string Name { get; set; }
            public void Run(int id) { }        
        } 
    }");

    Console.WriteLine($@"tree : {tree}");



    // 루트노드 조사
    var root = (CompilationUnitSyntax)tree.GetRoot();
    Console.WriteLine($@"root : {root}");

    // namespace 노드 리스팅
    foreach (var ns in root.Members.OfType<NamespaceDeclarationSyntax>())
    {
        Console.WriteLine($@"ns.Name : {ns.Name}");
        var nsName = ns.Name.ToString();

        foreach (var nsMem in ns.Members)
        {
            // class 노드
            if (nsMem is ClassDeclarationSyntax)
            {
                var cls = (ClassDeclarationSyntax)nsMem;
                Console.WriteLine($@"cls : {cls}");

                // class 노드의 멤버들 리스팅
                foreach (var clsChild in cls.ChildNodes())
                {
                    Console.WriteLine($@"clsChild : {clsChild}");

                    //속성
                    if (clsChild is PropertyDeclarationSyntax) 
                    {
                        var prop = (PropertyDeclarationSyntax)clsChild;
                        Console.WriteLine($@"prop.Identifier.ValueText : {prop.Identifier.ValueText}");
                    }
                    // 메서드
                    else if (clsChild is MethodDeclarationSyntax) 
                    {
                        var mth = (MethodDeclarationSyntax)clsChild;
                        Console.WriteLine($@"mth.Identifier.ValueText : {mth.Identifier.ValueText}");
                    }
                }
            }
        }
    }
}




컴파일 수행후, pdb exe 생성

/// <summary>
/// 소스코드 로드, CSharpSyntaxTree로 구조화
/// object의 어셈블리 (즉 mscorlib.dll)을 로드함.
/// 로드한 어셈블리와 소스코드트리를 이용하여 컴파일객체를 생성
/// 파싱 에러 체크
/// 심벌 바인딩 에러 체크
/// Emit(exe, pdb 생성)
/// </summary>
private static void _Compile()
{
    var tree = CSharpSyntaxTree.ParseText(@"
    using System;

    namespace HelloWorld 
    {
        class Program 
        {
            static void Main(string[] args) 
            {
                Console.WriteLine(""Hello, World!"");
            }
        }
    }");



    // Compilation 생성
    var mscorlibRef = MetadataReference.CreateFromFile(Assembly.GetAssembly(typeof(object)).Location); // mscorlib
    var compilation = CSharpCompilation.Create("test").AddReferences(mscorlibRef).AddSyntaxTrees(tree);



    // 파싱 에러 체크
    var parseDiags = compilation.GetParseDiagnostics();

    if (parseDiags.Any())
    {
        Console.WriteLine("Parse Errors!!!");
        parseDiags.ToList().ForEach(p => Console.WriteLine(p.ToString()));
    }
    else
    {
        Console.WriteLine("Parse OK");
    }



    // 심벌 바인딩 에러 체크
    var declDiags = compilation.GetDeclarationDiagnostics();

    if (declDiags.Any())
    {
        Console.WriteLine("Symbol Binding Errors!!!");
        declDiags.ToList().ForEach(p => Console.WriteLine(p.ToString()));
    }
    else
    {
        Console.WriteLine("Symbol Binding OK");
    }


    try
    {
        // EXE 생성
        Console.WriteLine("Emit ...");
        var emitResult = compilation.Emit(@"test.exe", @"test.pdb");

        // Emit 에러 체크
        if (emitResult.Diagnostics.Any())
        {
            Console.WriteLine("Emit Errors!!!");
            emitResult.Diagnostics.ToList().ForEach(p => Console.WriteLine(p.ToString()));
        }
        else
        {
            Console.WriteLine("Emit OK");
        }

    }
    catch (Exception ex)
    {
        Console.WriteLine($@"ex : {ex}");
    }
}




컴파일 수행후, 메소드 내부에 구현된 구현내용을 분석

/// <summary>
/// 소스코드로드, CSharpSyntaxTree로 구조화
/// Compilation 생성
/// GlobalNamespace 부터 시작하여 클래스, 속성, 메소드 까지 탐색...
/// 특정메소드(Run) 내부에 구현된 InvocationExpression을 조회하여 출력...
/// </summary>
private static void _CompileAndSenmaticAnalysis()
{
    var tree = CSharpSyntaxTree.ParseText(@"
using System;
namespace NS1 { 
class Class1 { 
private int _flag;
public int ID { get; set; }
public string Name { get; set; }
public void Run(int id) {
   int a = 1;
   a = a + id * 10;
   Console.WriteLine(a);
}
} 

class Class2 {} 
}");



    // Compilation 생성
    var mscorlibRef = MetadataReference.CreateFromFile(Assembly.GetAssembly(typeof(object)).Location); // mscorlib
    var compilation = CSharpCompilation.Create("test").AddReferences(mscorlibRef).AddSyntaxTrees(tree);



    // GlobalNamespace 심벌
    var globalNs = compilation.GlobalNamespace;

    foreach (var gNsMem in globalNs.GetMembers())
    {
        if (gNsMem.Name == "NS1")
        {
            // namespace 심벌
            var ns1 = (INamespaceSymbol)gNsMem;

            // class 심벌
            foreach (var ns1Mem in ns1.GetMembers())
            {
                Console.WriteLine(ns1Mem.ToDisplayString());
            }
        }
    }



    var root = tree.GetRoot();
    // Syntax tree에 대한 Semantic Model 객체 
    var semModel = compilation.GetSemanticModel(tree);
    // 메서드 트리노드 찾기
    var methodFirst = root.DescendantNodes().OfType<MethodDeclarationSyntax>().First();
    // 메서드 심벌 리턴
    var methodSym = semModel.GetDeclaredSymbol(methodFirst);
    Console.WriteLine($@"methodSym.ToDisplayString() : {methodSym.ToDisplayString()}");



    var classNode = root.DescendantNodes().OfType<ClassDeclarationSyntax>().First();
    var clsSym = semModel.GetDeclaredSymbol(classNode);

    foreach (var clsSymMem in clsSym.GetMembers())
    {
        if (clsSymMem is IMethodSymbol)
        {
            // 메서드 심벌 출력                
            Console.WriteLine($@"IMethodSymbol clsSymMem : {clsSymMem}");
        }
        else if (clsSymMem is IFieldSymbol)
        {
            // 필드 심벌 출력                
            Console.WriteLine($@"IFieldSymbol clsSymMem : {clsSymMem}");
        }
        else
        {
            // skip
        }
    }



    // Run() 안의 Console.WriteLine() 호출
    var firstInvokeExpSyntax = methodFirst.DescendantNodes().OfType<InvocationExpressionSyntax>().First();
    Console.WriteLine($@"firstInvokeExpSyntax : {firstInvokeExpSyntax}");

    var symInfo = semModel.GetSymbolInfo(firstInvokeExpSyntax);
    var symInfoSym = symInfo.Symbol;

    if (symInfoSym.ContainingAssembly.Name == "mscorlib" && symInfoSym.ContainingNamespace.Name == "System" &&
        symInfoSym.ContainingType.Name == "Console" && symInfoSym.Name == "WriteLine")
    {
        Console.WriteLine("System.Console 클래스의 WriteLine 메서드임");
    }



    // 표현식 : a = a + id * 10
    var firstBinExpSyntax = methodFirst.DescendantNodes().OfType<BinaryExpressionSyntax>().First();
    var firstBinExpTypeInfo = semModel.GetTypeInfo(firstBinExpSyntax);
    Console.WriteLine(firstBinExpTypeInfo.Type);  // int
}
%23%20160517%20roslyn%20C%23%20%uCEF4%uD30C%uC77C%20API%20%uD14C%uC2A4%uD2B8%0A%0A@%28%uD669%uD604%uB3D9%20%uB178%uD2B8%uBD81%29%5Broslyn%2C%20c%23%2C%20study%2C%20.net%5D%0A%0A%5Btoc%5D%0A%0A%3Cbr/%3E%0A%3Cbr/%3E%0A%3Cbr/%3E%0A%0A%23%23%20roslyn%20%uCD94%uAC00%0A-%20nuget%20package%20manager%uB85C%20%uCD94%uAC00%0A%20%0A%60%60%60powershell%0APM%3E%20Install-Package%20Microsoft.CodeAnalysis%20-Pre%0A%60%60%60%0A%0A%3Cbr/%3E%0A%3Cbr/%3E%0A%3Cbr/%3E%0A%0A%23%23%20%uC608%uC81C%20%uB2E4%uC6B4%uB85C%uB4DC%0Ahttps%3A//github.com/HyundongHwang/MyRoslynTest%0A%0A%3Cbr/%3E%0A%3Cbr/%3E%0A%3Cbr/%3E%0A%0A%23%23%20%uC18C%uC2A4%uCF54%uB4DC%uB97C%20%uB85C%uB4DC%uD6C4%2C%20%uB124%uC784%uC2A4%uD398%uC774%uC2A4%2C%20%uD074%uB798%uC2A4%2C%20%uC18D%uC131%2C%20%uBA54%uC18C%uB4DC%20%uBD84%uC11D%0A%0A%60%60%60csharp%0A///%20%3Csummary%3E%0A///%20%uC18C%uC2A4%uCF54%uB4DC%uB97C%20%uB85C%uB4DC%0A///%20CSharpSyntaxTree%20%uB85C%20%uAD6C%uC870%uD654%0A///%20%uB124%uC784%uC2A4%uD398%uC774%uC2A4%2C%20%uD074%uB798%uC2A4%2C%20%uC18D%uC131%2C%20%uBA54%uC18C%uB4DC%uB97C%20%uCC28%uB840%uB85C%20%uC21C%uD658%uD558%uBA70%20%uBD84%uC11D%0A///%20%3C/summary%3E%0Aprivate%20static%20void%20_PrintNsClassPropMethod%28%29%0A%7B%0A%20%20%20%20//%20CSharpSyntaxTree%uB85C%20%uC18C%uC2A4%uCF54%uB4DC%20%uD30C%uC2F1%0A%20%20%20%20var%20tree%20%3D%20CSharpSyntaxTree.ParseText%28%0A@%22%0A%20%20%20%20namespace%20NS1%0A%20%20%20%20%7B%20%0A%20%20%20%20%20%20%20%20class%20Class1%0A%20%20%20%20%20%20%20%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20public%20int%20ID%20%7B%20get%3B%20set%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20public%20string%20Name%20%7B%20get%3B%20set%3B%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20public%20void%20Run%28int%20id%29%20%7B%20%7D%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%7D%20%0A%20%20%20%20%7D%22%29%3B%0A%0A%20%20%20%20Console.WriteLine%28%24@%22tree%20%3A%20%7Btree%7D%22%29%3B%0A%0A%0A%0A%20%20%20%20//%20%uB8E8%uD2B8%uB178%uB4DC%20%uC870%uC0AC%0A%20%20%20%20var%20root%20%3D%20%28CompilationUnitSyntax%29tree.GetRoot%28%29%3B%0A%20%20%20%20Console.WriteLine%28%24@%22root%20%3A%20%7Broot%7D%22%29%3B%0A%0A%20%20%20%20//%20namespace%20%uB178%uB4DC%20%uB9AC%uC2A4%uD305%0A%20%20%20%20foreach%20%28var%20ns%20in%20root.Members.OfType%3CNamespaceDeclarationSyntax%3E%28%29%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20Console.WriteLine%28%24@%22ns.Name%20%3A%20%7Bns.Name%7D%22%29%3B%0A%20%20%20%20%20%20%20%20var%20nsName%20%3D%20ns.Name.ToString%28%29%3B%0A%0A%20%20%20%20%20%20%20%20foreach%20%28var%20nsMem%20in%20ns.Members%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20//%20class%20%uB178%uB4DC%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28nsMem%20is%20ClassDeclarationSyntax%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20cls%20%3D%20%28ClassDeclarationSyntax%29nsMem%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine%28%24@%22cls%20%3A%20%7Bcls%7D%22%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20class%20%uB178%uB4DC%uC758%20%uBA64%uBC84%uB4E4%20%uB9AC%uC2A4%uD305%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20foreach%20%28var%20clsChild%20in%20cls.ChildNodes%28%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine%28%24@%22clsChild%20%3A%20%7BclsChild%7D%22%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%uC18D%uC131%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28clsChild%20is%20PropertyDeclarationSyntax%29%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20prop%20%3D%20%28PropertyDeclarationSyntax%29clsChild%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine%28%24@%22prop.Identifier.ValueText%20%3A%20%7Bprop.Identifier.ValueText%7D%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%uBA54%uC11C%uB4DC%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20%28clsChild%20is%20MethodDeclarationSyntax%29%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20mth%20%3D%20%28MethodDeclarationSyntax%29clsChild%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine%28%24@%22mth.Identifier.ValueText%20%3A%20%7Bmth.Identifier.ValueText%7D%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%0A%60%60%60%0A%0A%3Cbr/%3E%0A%3Cbr/%3E%0A%3Cbr/%3E%0A%0A%23%23%20%uCEF4%uD30C%uC77C%20%uC218%uD589%uD6C4%2C%20pdb%20exe%20%uC0DD%uC131%0A%0A%60%60%60csharp%0A///%20%3Csummary%3E%0A///%20%uC18C%uC2A4%uCF54%uB4DC%20%uB85C%uB4DC%2C%20CSharpSyntaxTree%uB85C%20%uAD6C%uC870%uD654%0A///%20object%uC758%20%uC5B4%uC148%uBE14%uB9AC%20%28%uC989%20mscorlib.dll%29%uC744%20%uB85C%uB4DC%uD568.%0A///%20%uB85C%uB4DC%uD55C%20%uC5B4%uC148%uBE14%uB9AC%uC640%20%uC18C%uC2A4%uCF54%uB4DC%uD2B8%uB9AC%uB97C%20%uC774%uC6A9%uD558%uC5EC%20%uCEF4%uD30C%uC77C%uAC1D%uCCB4%uB97C%20%uC0DD%uC131%0A///%20%uD30C%uC2F1%20%uC5D0%uB7EC%20%uCCB4%uD06C%0A///%20%uC2EC%uBC8C%20%uBC14%uC778%uB529%20%uC5D0%uB7EC%20%uCCB4%uD06C%0A///%20Emit%28exe%2C%20pdb%20%uC0DD%uC131%29%0A///%20%3C/summary%3E%0Aprivate%20static%20void%20_Compile%28%29%0A%7B%0A%20%20%20%20var%20tree%20%3D%20CSharpSyntaxTree.ParseText%28@%22%0A%20%20%20%20using%20System%3B%0A%0A%20%20%20%20namespace%20HelloWorld%20%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20class%20Program%20%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20static%20void%20Main%28string%5B%5D%20args%29%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine%28%22%22Hello%2C%20World%21%22%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%22%29%3B%0A%0A%0A%0A%20%20%20%20//%20Compilation%20%uC0DD%uC131%0A%20%20%20%20var%20mscorlibRef%20%3D%20MetadataReference.CreateFromFile%28Assembly.GetAssembly%28typeof%28object%29%29.Location%29%3B%20//%20mscorlib%0A%20%20%20%20var%20compilation%20%3D%20CSharpCompilation.Create%28%22test%22%29.AddReferences%28mscorlibRef%29.AddSyntaxTrees%28tree%29%3B%0A%0A%0A%0A%20%20%20%20//%20%uD30C%uC2F1%20%uC5D0%uB7EC%20%uCCB4%uD06C%0A%20%20%20%20var%20parseDiags%20%3D%20compilation.GetParseDiagnostics%28%29%3B%0A%0A%20%20%20%20if%20%28parseDiags.Any%28%29%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20Console.WriteLine%28%22Parse%20Errors%21%21%21%22%29%3B%0A%20%20%20%20%20%20%20%20parseDiags.ToList%28%29.ForEach%28p%20%3D%3E%20Console.WriteLine%28p.ToString%28%29%29%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20else%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20Console.WriteLine%28%22Parse%20OK%22%29%3B%0A%20%20%20%20%7D%0A%0A%0A%0A%20%20%20%20//%20%uC2EC%uBC8C%20%uBC14%uC778%uB529%20%uC5D0%uB7EC%20%uCCB4%uD06C%0A%20%20%20%20var%20declDiags%20%3D%20compilation.GetDeclarationDiagnostics%28%29%3B%0A%0A%20%20%20%20if%20%28declDiags.Any%28%29%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20Console.WriteLine%28%22Symbol%20Binding%20Errors%21%21%21%22%29%3B%0A%20%20%20%20%20%20%20%20declDiags.ToList%28%29.ForEach%28p%20%3D%3E%20Console.WriteLine%28p.ToString%28%29%29%29%3B%0A%20%20%20%20%7D%0A%20%20%20%20else%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20Console.WriteLine%28%22Symbol%20Binding%20OK%22%29%3B%0A%20%20%20%20%7D%0A%0A%0A%20%20%20%20try%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20//%20EXE%20%uC0DD%uC131%0A%20%20%20%20%20%20%20%20Console.WriteLine%28%22Emit%20...%22%29%3B%0A%20%20%20%20%20%20%20%20var%20emitResult%20%3D%20compilation.Emit%28@%22test.exe%22%2C%20@%22test.pdb%22%29%3B%0A%0A%20%20%20%20%20%20%20%20//%20Emit%20%uC5D0%uB7EC%20%uCCB4%uD06C%0A%20%20%20%20%20%20%20%20if%20%28emitResult.Diagnostics.Any%28%29%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine%28%22Emit%20Errors%21%21%21%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20emitResult.Diagnostics.ToList%28%29.ForEach%28p%20%3D%3E%20Console.WriteLine%28p.ToString%28%29%29%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine%28%22Emit%20OK%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%7D%0A%20%20%20%20catch%20%28Exception%20ex%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20Console.WriteLine%28%24@%22ex%20%3A%20%7Bex%7D%22%29%3B%0A%20%20%20%20%7D%0A%7D%0A%60%60%60%0A%0A%3Cbr/%3E%0A%3Cbr/%3E%0A%3Cbr/%3E%0A%0A%23%23%20%uCEF4%uD30C%uC77C%20%uC218%uD589%uD6C4%2C%20%uBA54%uC18C%uB4DC%20%uB0B4%uBD80%uC5D0%20%uAD6C%uD604%uB41C%20%uAD6C%uD604%uB0B4%uC6A9%uC744%20%uBD84%uC11D%0A%0A%60%60%60csharp%0A///%20%3Csummary%3E%0A///%20%uC18C%uC2A4%uCF54%uB4DC%uB85C%uB4DC%2C%20CSharpSyntaxTree%uB85C%20%uAD6C%uC870%uD654%0A///%20Compilation%20%uC0DD%uC131%0A///%20GlobalNamespace%20%uBD80%uD130%20%uC2DC%uC791%uD558%uC5EC%20%uD074%uB798%uC2A4%2C%20%uC18D%uC131%2C%20%uBA54%uC18C%uB4DC%20%uAE4C%uC9C0%20%uD0D0%uC0C9...%0A///%20%uD2B9%uC815%uBA54%uC18C%uB4DC%28Run%29%20%uB0B4%uBD80%uC5D0%20%uAD6C%uD604%uB41C%20InvocationExpression%uC744%20%uC870%uD68C%uD558%uC5EC%20%uCD9C%uB825...%0A///%20%3C/summary%3E%0Aprivate%20static%20void%20_CompileAndSenmaticAnalysis%28%29%0A%7B%0A%20%20%20%20var%20tree%20%3D%20CSharpSyntaxTree.ParseText%28@%22%0Ausing%20System%3B%0Anamespace%20NS1%20%7B%20%0Aclass%20Class1%20%7B%20%0Aprivate%20int%20_flag%3B%0Apublic%20int%20ID%20%7B%20get%3B%20set%3B%20%7D%0Apublic%20string%20Name%20%7B%20get%3B%20set%3B%20%7D%0Apublic%20void%20Run%28int%20id%29%20%7B%0A%20%20%20int%20a%20%3D%201%3B%0A%20%20%20a%20%3D%20a%20+%20id%20*%2010%3B%0A%20%20%20Console.WriteLine%28a%29%3B%0A%7D%0A%7D%20%0A%0Aclass%20Class2%20%7B%7D%20%0A%7D%22%29%3B%0A%0A%0A%0A%20%20%20%20//%20Compilation%20%uC0DD%uC131%0A%20%20%20%20var%20mscorlibRef%20%3D%20MetadataReference.CreateFromFile%28Assembly.GetAssembly%28typeof%28object%29%29.Location%29%3B%20//%20mscorlib%0A%20%20%20%20var%20compilation%20%3D%20CSharpCompilation.Create%28%22test%22%29.AddReferences%28mscorlibRef%29.AddSyntaxTrees%28tree%29%3B%0A%0A%0A%0A%20%20%20%20//%20GlobalNamespace%20%uC2EC%uBC8C%0A%20%20%20%20var%20globalNs%20%3D%20compilation.GlobalNamespace%3B%0A%0A%20%20%20%20foreach%20%28var%20gNsMem%20in%20globalNs.GetMembers%28%29%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20if%20%28gNsMem.Name%20%3D%3D%20%22NS1%22%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20//%20namespace%20%uC2EC%uBC8C%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20ns1%20%3D%20%28INamespaceSymbol%29gNsMem%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20//%20class%20%uC2EC%uBC8C%0A%20%20%20%20%20%20%20%20%20%20%20%20foreach%20%28var%20ns1Mem%20in%20ns1.GetMembers%28%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine%28ns1Mem.ToDisplayString%28%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%0A%0A%20%20%20%20var%20root%20%3D%20tree.GetRoot%28%29%3B%0A%20%20%20%20//%20Syntax%20tree%uC5D0%20%uB300%uD55C%20Semantic%20Model%20%uAC1D%uCCB4%20%0A%20%20%20%20var%20semModel%20%3D%20compilation.GetSemanticModel%28tree%29%3B%0A%20%20%20%20//%20%uBA54%uC11C%uB4DC%20%uD2B8%uB9AC%uB178%uB4DC%20%uCC3E%uAE30%0A%20%20%20%20var%20methodFirst%20%3D%20root.DescendantNodes%28%29.OfType%3CMethodDeclarationSyntax%3E%28%29.First%28%29%3B%0A%20%20%20%20//%20%uBA54%uC11C%uB4DC%20%uC2EC%uBC8C%20%uB9AC%uD134%0A%20%20%20%20var%20methodSym%20%3D%20semModel.GetDeclaredSymbol%28methodFirst%29%3B%0A%20%20%20%20Console.WriteLine%28%24@%22methodSym.ToDisplayString%28%29%20%3A%20%7BmethodSym.ToDisplayString%28%29%7D%22%29%3B%0A%0A%0A%0A%20%20%20%20var%20classNode%20%3D%20root.DescendantNodes%28%29.OfType%3CClassDeclarationSyntax%3E%28%29.First%28%29%3B%0A%20%20%20%20var%20clsSym%20%3D%20semModel.GetDeclaredSymbol%28classNode%29%3B%0A%0A%20%20%20%20foreach%20%28var%20clsSymMem%20in%20clsSym.GetMembers%28%29%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20if%20%28clsSymMem%20is%20IMethodSymbol%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20//%20%uBA54%uC11C%uB4DC%20%uC2EC%uBC8C%20%uCD9C%uB825%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine%28%24@%22IMethodSymbol%20clsSymMem%20%3A%20%7BclsSymMem%7D%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%20if%20%28clsSymMem%20is%20IFieldSymbol%29%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20//%20%uD544%uB4DC%20%uC2EC%uBC8C%20%uCD9C%uB825%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine%28%24@%22IFieldSymbol%20clsSymMem%20%3A%20%7BclsSymMem%7D%22%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20//%20skip%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%0A%0A%20%20%20%20//%20Run%28%29%20%uC548%uC758%20Console.WriteLine%28%29%20%uD638%uCD9C%0A%20%20%20%20var%20firstInvokeExpSyntax%20%3D%20methodFirst.DescendantNodes%28%29.OfType%3CInvocationExpressionSyntax%3E%28%29.First%28%29%3B%0A%20%20%20%20Console.WriteLine%28%24@%22firstInvokeExpSyntax%20%3A%20%7BfirstInvokeExpSyntax%7D%22%29%3B%0A%0A%20%20%20%20var%20symInfo%20%3D%20semModel.GetSymbolInfo%28firstInvokeExpSyntax%29%3B%0A%20%20%20%20var%20symInfoSym%20%3D%20symInfo.Symbol%3B%0A%0A%20%20%20%20if%20%28symInfoSym.ContainingAssembly.Name%20%3D%3D%20%22mscorlib%22%20%26%26%20symInfoSym.ContainingNamespace.Name%20%3D%3D%20%22System%22%20%26%26%0A%20%20%20%20%20%20%20%20symInfoSym.ContainingType.Name%20%3D%3D%20%22Console%22%20%26%26%20symInfoSym.Name%20%3D%3D%20%22WriteLine%22%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20Console.WriteLine%28%22System.Console%20%uD074%uB798%uC2A4%uC758%20WriteLine%20%uBA54%uC11C%uB4DC%uC784%22%29%3B%0A%20%20%20%20%7D%0A%0A%0A%0A%20%20%20%20//%20%uD45C%uD604%uC2DD%20%3A%20a%20%3D%20a%20+%20id%20*%2010%0A%20%20%20%20var%20firstBinExpSyntax%20%3D%20methodFirst.DescendantNodes%28%29.OfType%3CBinaryExpressionSyntax%3E%28%29.First%28%29%3B%0A%20%20%20%20var%20firstBinExpTypeInfo%20%3D%20semModel.GetTypeInfo%28firstBinExpSyntax%29%3B%0A%20%20%20%20Console.WriteLine%28firstBinExpTypeInfo.Type%29%3B%20%20//%20int%0A%7D%0A%60%60%60

이 글은 Evernote에서 작성되었습니다. Evernote는 하나의 업무 공간입니다. Evernote를 다운로드하세요.

댓글