3

roslyn コンパイラ サービスの学習に多くの時間を費やす前に、次のシナリオが roslyn で可能かどうかを尋ねたいと思います。ディスクに何も書き込まずにアセンブリをコンパイルして実行することはできますか? メタモデルに基づいて完全なソリューションを生成し、それを取得してコンパイルし、実行したいと考えています。Roslynでそれは可能ですか?

4

2 に答える 2

3

これは少し軽いバージョンです:

// Some standard references most projects use
var references = new List<MetadataReference>
{
    MetadataReference.CreateAssemblyReference("mscorlib"),
    MetadataReference.CreateAssemblyReference("System"),
    MetadataReference.CreateAssemblyReference("System.Linq"),
    new MetadataFileReference(this.GetType().Assembly.Location)
};

// The MyClassInAString is where your code goes
var syntaxTree = SyntaxTree.ParseText(MyClassInAString);

// Use Roslyn to compile the code into a DLL
var compiledCode = Compilation.Create(
    "MyAssemblyName",
    options: new CompilationOptions(OutputKind.DynamicallyLinkedLibrary),
    syntaxTrees: syntaxTree,
    references: references;
    );

// Now read the code into a memory stream. You can then load types out of the assembly with reflection
Assembly assembly;
using (var stream = new MemoryStream())
{
    EmitResult compileResult = compiledCode.Emit(stream);
    if (!compileResult.Success)
    {
        throw new InvalidOperationException("The assembly could not be built, there are {0} diagnostic messages.".FormatWith(compileResult.Diagnostics.Count()));
    }
    assembly = Assembly.Load(stream.GetBuffer());
}
于 2014-01-30T16:04:06.790 に答える