gpt4 book ai didi

使用 CSharpCodeProvider 进行 C# 运行时编译

转载 作者:行者123 更新时间:2023-11-30 20:38:11 26 4
gpt4 key购买 nike

我已成功使用本教程:http://www.codeproject.com/Tips/715891/Compiling-Csharp-Code-at-Runtime为 C# 代码的运行时编译和执行设置一个框架。以下是我目前拥有的代码:

public static class CodeCompiler {

public static object InterpretString(string executable) {
string compilation_string =
@"
static class RuntimeCompilationCode {
public static void Main() {}
public static object Custom() {
/* CODE HERE */
}
}";

compilation_string = compilation_string.Replace("/* CODE HERE */", executable);

CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters compiler_parameters = new CompilerParameters();

// True - memory generation, false - external file generation
compiler_parameters.GenerateInMemory = true;

// True - exe file generation, false - dll file generation
compiler_parameters.GenerateExecutable = true;

// Compile
CompilerResults results = provider.CompileAssemblyFromSource(compiler_parameters, compilation_string);

// Check errors
if (results.Errors.HasErrors) {
StringBuilder builder = new StringBuilder();
foreach (CompilerError error in results.Errors) {
builder.AppendLine(String.Format("Error ({0}): {1}", error.ErrorNumber, error.ErrorText));
}
throw new InvalidOperationException(builder.ToString());
}

// Execute
Assembly assembly = results.CompiledAssembly;
Type program = assembly.GetType("RuntimeCompilationCode");
MethodInfo execute = program.GetMethod("Custom");
return execute.Invoke(null, null);
}

}

我可以将字符串形式的语句(例如 "return 2;")传递给 InterpretString(),它将作为一部分进行编译和执行Custom() 函数。但是我想知道是否可以使用相同的方法来执行原始文件中的方法。例如,假设 CodeCompiler 类有另一个返回整数 2 的方法 returnsTwo()。有没有办法通过传递 "CodeCompiler. returnsTwo();" 或与 InterpretString() 类似的字符串?

最佳答案

前提是函数是静态函数这应该不是问题,只要在编译时添加适当的引用即可。我在几个项目中都做过这样的事情。

如果 CodeCompiler 在您当前的可执行文件中,您必须以这种方式包含引用:

string exePath = Assembly.GetExecutingAssembly().Location;
string exeDir = Path.GetDirectoryName(exePath);

AssemblyName[] assemRefs = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
List<string> references = new List<string>();

foreach (AssemblyName assemblyName in assemRefs)
references.Add(assemblyName.Name + ".dll");

for (int i = 0; i < references.Count; i++)
{
string localName = Path.Combine(exeDir, references[i]);

if (File.Exists(localName))
references[i] = localName;
}

references.Add(exePath);

CompilerParameters compiler_parameters = new CompilerParameters(references.ToArray())

关于使用 CSharpCodeProvider 进行 C# 运行时编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35352218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com