web-dev-qa-db-ja.com

生成DLL実行時に動的にアセンブリ

現在、動的に生成されるコードがいくつかあります。つまり、C#.csファイルはプログラムによって動的に作成され、このC#ファイルを別のプロジェクトに含めることを意図しています。

課題は、C#.csファイルを生成する代わりに.DLLファイルを生成して、あらゆる種類の.NETアプリケーション(C#だけでなく)から参照できるようにして、より役立つようにすることです。

31
7wp
using System.CodeDom.Compiler;
using System.Diagnostics;
using Microsoft.CSharp;

CSharpCodeProvider codeProvider = new CSharpCodeProvider();
ICodeCompiler icc = codeProvider.CreateCompiler();
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.OutputAssembly = "AutoGen.dll";
CompilerResults results = icc.CompileAssemblyFromSource(parameters, yourCodeAsString);

http://support.Microsoft.com/kb/304655 から適応

39
Rex M

それを行うための非推奨されていない方法(以前のポスターで述べたように.NET 4.0を使用):

using System.CodeDom.Compiler;
using System.Reflection;
using System;
public class J
{
    public static void Main()
    {       
        System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
        parameters.GenerateExecutable = false;
        parameters.OutputAssembly = "AutoGen.dll";

        CompilerResults r = CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(parameters, "public class B {public static int k=7;}");

        //verify generation
        Console.WriteLine(Assembly.LoadFrom("AutoGen.dll").GetType("B").GetField("k").GetValue(null));
    }
}
32
Anssssss

現在、最善の策は CSharpCodeProvider ;です。 4.0の計画には「サービスとしてのコンパイラ」が含まれており、これにより完全に管理されます。

4
Marc Gravell