<span class="hljs-keyword">using</span> System;
<span class="hljs-keyword">using</span> System.Collections.Generic;
<span class="hljs-keyword">using</span> System.Text;
<span class="hljs-keyword">using</span> System.IO;
<span class="hljs-keyword">using</span> Microsoft.CodeAnalysis.CSharp;
<span class="hljs-keyword">using</span> Microsoft.CodeAnalysis;
<span class="hljs-keyword">using</span> Microsoft.CodeAnalysis.Text;
<span class="hljs-keyword">namespace</span> <span class="hljs-title">RoslynComple</span>
{
<span class="hljs-keyword">class</span> <span class="hljs-title">Program</span>
{
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">readonly</span> IEnumerable<<span class="hljs-keyword">string</span>> DefaultNamepaces =
<span class="hljs-keyword">new</span>[]
{
<span class="hljs-string">"System"</span>,
<span class="hljs-string">"System.IO"</span>,
<span class="hljs-string">"System.Net"</span>,
<span class="hljs-string">"System.Linq"</span>,
<span class="hljs-string">"System.Text"</span>,
<span class="hljs-string">"System.Text.RegularExpressions"</span>,
<span class="hljs-string">"System.Collections.Generic"</span>
};
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">string</span> runtimePath
= <span class="hljs-string">@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\{0}.dll"</span>;
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">readonly</span> IEnumerable<MetadataReference> DefaultRefrences =
<span class="hljs-keyword">new</span>[]
{
MetadataReference.CreateFromFile(<span class="hljs-keyword">string</span>.Format(runtimePath, <span class="hljs-string">"mscorlib"</span>)),
MetadataReference.CreateFromFile(<span class="hljs-keyword">string</span>.Format(runtimePath, <span class="hljs-string">"System"</span>)),
MetadataReference.CreateFromFile(<span class="hljs-keyword">string</span>.Format(runtimePath, <span class="hljs-string">"System.Core"</span>))
};
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">readonly</span> CSharpCompilationOptions DefaultCompletionOpsions =
<span class="hljs-keyword">new</span> CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
.WithOverflowChecks(<span class="hljs-literal">true</span>).WithOptimizationLevel(OptimizationLevel.Release)
.WithUsings(DefaultNamepaces);
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> SyntaxTree <span class="hljs-title">Parse</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> text, <span class="hljs-keyword">string</span> filename = <span class="hljs-string">""</span>, CSharpParseOptions options = <span class="hljs-literal">null</span></span>)</span>
{
<span class="hljs-keyword">var</span> stringText = SourceText.From(text, Encoding.UTF8);
<span class="hljs-keyword">return</span> SyntaxFactory.ParseSyntaxTree(stringText, options, filename);
}
<span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Main</span>(<span class="hljs-params"><span class="hljs-keyword">string</span>[] args</span>)</span>
{
<span class="hljs-comment">// DLL Source Code</span>
<span class="hljs-keyword">var</span> fileToCompile = <span class="hljs-string">@"C:\temp\Test.cs"</span>;
<span class="hljs-keyword">var</span> source = File.ReadAllText(fileToCompile);
<span class="hljs-keyword">var</span> parseSyntaxTree
= Parse(source, <span class="hljs-string">""</span>, CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp7_3));
<span class="hljs-keyword">var</span> compliation
= CSharpCompilation.Create(<span class="hljs-string">"test.dll"</span>,
<span class="hljs-keyword">new</span> SyntaxTree[] { parseSyntaxTree },
DefaultRefrences, DefaultCompletionOpsions);
<span class="hljs-keyword">try</span>
{
<span class="hljs-keyword">var</span> result = compliation.Emit(<span class="hljs-string">@"c:\temp\Test.dll"</span>);
Console.WriteLine(result.Success ? <span class="hljs-string">"Sucess!!"</span> : <span class="hljs-string">"Failed"</span>);
}
<span class="hljs-keyword">catch</span> (Exception ex)
{
Console.WriteLine(ex);
<span class="hljs-keyword">throw</span>;
}
Console.Read();
}
}
}
<span class="hljs-keyword">using</span> System;
<span class="hljs-keyword">using</span> System.Collections.Generic;
<span class="hljs-keyword">using</span> System.Text;
<span class="hljs-keyword">using</span> System.IO;
<span class="hljs-keyword">using</span> Microsoft.CodeAnalysis.CSharp;
<span class="hljs-keyword">using</span> Microsoft.CodeAnalysis;
<span class="hljs-keyword">using</span> Microsoft.CodeAnalysis.Text;
<span class="hljs-keyword">namespace</span> <span class="hljs-title">RoslynComple</span>
{
<span class="hljs-keyword">class</span> <span class="hljs-title">Program</span>
{
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">readonly</span> IEnumerable<<span class="hljs-keyword">string</span>> DefaultNamepaces =
<span class="hljs-keyword">new</span>[]
{
<span class="hljs-string">"System"</span>,
<span class="hljs-string">"System.IO"</span>,
<span class="hljs-string">"System.Net"</span>,
<span class="hljs-string">"System.Linq"</span>,
<span class="hljs-string">"System.Text"</span>,
<span class="hljs-string">"System.Text.RegularExpressions"</span>,
<span class="hljs-string">"System.Collections.Generic"</span>
};
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">string</span> runtimePath
= <span class="hljs-string">@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\{0}.dll"</span>;
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">readonly</span> IEnumerable<MetadataReference> DefaultRefrences =
<span class="hljs-keyword">new</span>[]
{
MetadataReference.CreateFromFile(<span class="hljs-keyword">string</span>.Format(runtimePath, <span class="hljs-string">"mscorlib"</span>)),
MetadataReference.CreateFromFile(<span class="hljs-keyword">string</span>.Format(runtimePath, <span class="hljs-string">"System"</span>)),
MetadataReference.CreateFromFile(<span class="hljs-keyword">string</span>.Format(runtimePath, <span class="hljs-string">"System.Core"</span>))
};
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">readonly</span> CSharpCompilationOptions DefaultCompletionOpsions =
<span class="hljs-keyword">new</span> CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
.WithOverflowChecks(<span class="hljs-literal">true</span>).WithOptimizationLevel(OptimizationLevel.Release)
.WithUsings(DefaultNamepaces);
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> SyntaxTree <span class="hljs-title">Parse</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> text, <span class="hljs-keyword">string</span> filename = <span class="hljs-string">""</span>, CSharpParseOptions options = <span class="hljs-literal">null</span></span>)</span>
{
<span class="hljs-keyword">var</span> stringText = SourceText.From(text, Encoding.UTF8);
<span class="hljs-keyword">return</span> SyntaxFactory.ParseSyntaxTree(stringText, options, filename);
}
<span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Main</span>(<span class="hljs-params"><span class="hljs-keyword">string</span>[] args</span>)</span>
{
<span class="hljs-comment">// DLL Source Code</span>
<span class="hljs-keyword">var</span> fileToCompile = <span class="hljs-string">@"C:\temp\Test.cs"</span>;
<span class="hljs-keyword">var</span> source = File.ReadAllText(fileToCompile);
<span class="hljs-keyword">var</span> parseSyntaxTree
= Parse(source, <span class="hljs-string">""</span>, CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp7_3));
<span class="hljs-keyword">var</span> compliation
= CSharpCompilation.Create(<span class="hljs-string">"test.dll"</span>,
<span class="hljs-keyword">new</span> SyntaxTree[] { parseSyntaxTree },
DefaultRefrences, DefaultCompletionOpsions);
<span class="hljs-keyword">try</span>
{
<span class="hljs-keyword">var</span> result = compliation.Emit(<span class="hljs-string">@"c:\temp\Test.dll"</span>);
Console.WriteLine(result.Success ? <span class="hljs-string">"Sucess!!"</span> : <span class="hljs-string">"Failed"</span>);
}
<span class="hljs-keyword">catch</span> (Exception ex)
{
Console.WriteLine(ex);
<span class="hljs-keyword">throw</span>;
}
Console.Read();
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
namespace RoslynComple
{
class Program
{
private static readonly IEnumerable<string> DefaultNamepaces =
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.8\{0}.dll";
private static readonly IEnumerable<MetadataReference> DefaultRefrences =
new[]
{
MetadataReference.CreateFromFile(string.Format(runtimePath, "mscorlib")),
MetadataReference.CreateFromFile(string.Format(runtimePath, "System")),
MetadataReference.CreateFromFile(string.Format(runtimePath, "System.Core"))
};
private static readonly CSharpCompilationOptions DefaultCompletionOpsions =
new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
.WithOverflowChecks(true).WithOptimizationLevel(OptimizationLevel.Release)
.WithUsings(DefaultNamepaces);
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)
{
// DLL Source Code
var fileToCompile = @"C:\temp\Test.cs";
var source = File.ReadAllText(fileToCompile);
var parseSyntaxTree
= Parse(source, "", CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp7_3));
var compliation
= CSharpCompilation.Create("test.dll",
new SyntaxTree[] { parseSyntaxTree },
DefaultRefrences, DefaultCompletionOpsions);
try
{
var result = compliation.Emit(@"c:\temp\Test.dll");
Console.WriteLine(result.Success ? "Sucess!!" : "Failed");
}
catch (Exception ex)
{
Console.WriteLine(ex);
throw;
}
Console.Read();
}
}
}
nugetでMicrosoft.CodeAnalysis.CSharpの追加が必要。(その他依存関係にあるパッケージも。)
参考:
- Visual Studio 2015の新機能“Roslyn”とは – Build Insider
- .NET Compiler Platform SDK – Visual Studio Marketplace
- Microsoft.CodeAnalysis.CSharp Namespace
- GitHub – dotnet/roslyn: The Roslyn .NET compiler provides C# and Visual Basic languages with rich code analysis APIs.
- C#:Roslynを使って数式を計算するクラスを作成してみた – Qiita
- Roslyn CodeAnalysisでC#ソースの解析をしてみる – 気まま研究所ブログ
- Discover .NET – roslyn
コメント