Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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
C# 在运行时动态生成DLL程序集_C#_.net_Dll_Code Generation - Fatal编程技术网

C# 在运行时动态生成DLL程序集

C# 在运行时动态生成DLL程序集,c#,.net,dll,code-generation,C#,.net,Dll,Code Generation,目前我有一些动态生成的代码。换句话说,一个C#.cs文件是由程序动态创建的,目的是将这个C#文件包含在另一个项目中 挑战在于,我希望生成一个.DLL文件,而不是生成一个C#.cs文件,这样它就可以被任何类型的.NET应用程序(不仅仅是C#)引用,因此更有用 using System.CodeDom.Compiler; using System.Diagnostics; using Microsoft.CSharp; CSharpCodeProvider codeProvider = new C

目前我有一些动态生成的代码。换句话说,一个C#.cs文件是由程序动态创建的,目的是将这个C#文件包含在另一个项目中

挑战在于,我希望生成一个.DLL文件,而不是生成一个C#.cs文件,这样它就可以被任何类型的.NET应用程序(不仅仅是C#)引用,因此更有用

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);

改编自现在,你最好的选择是;4.0的计划包括“作为服务的编译器”,这将使其得到全面管理。

这是一种不受欢迎的方式(如前所述,使用.NET 4.0):


主题的标题是“在运行时动态生成dll程序集”而不是“在运行时动态生成EXE程序集”。您的链接描述与在运行时创建EXE有关。@AminGhaderi谁说过EXE?如果你的意思是“但是MSDN上的代码示例创建了一个exe”,那么它也会很高兴地创建DLL;最终,如果使用
parameters.GenerateInMemory=true,则文件包不是程序集的有趣部分
您可以使用
r.CompiledAssembly
获取内存中的程序集注意:此代码的旧版本有一行额外的代码,这些代码使用CSharpCodeProvider.CreateCompiler()从提供程序创建编译器。这是不推荐的,您应该直接在提供程序上调用compile。
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));
    }
}