【发布时间】:2015-12-03 17:18:23
【问题描述】:
由于CompileAssemblyFromSource add custom functions in a smart way 被忽略了,我会以不同的方式提出这个问题,所以人们会费心去阅读它。
切入正题,我正在通过将新语法“翻译”成 c# 并以这种方式在内存中编译它来制作一种语言。
using (Microsoft.CSharp.CSharpCodeProvider CodeProv =
new Microsoft.CSharp.CSharpCodeProvider())
{
CompilerResults results = CodeProv.CompileAssemblyFromSource(
new System.CodeDom.Compiler.CompilerParameters()
{
GenerateInMemory = true
},
code);
var type = results.CompiledAssembly.GetType("MainClass");
var obj = Activator.CreateInstance(type);
var output = type.GetMethod("Execute").Invoke(obj, new object[] { });
Console.WriteLine(output);
}
基本上我正在执行写在code 变量中的“主”函数。
我在代码变量中使用了一些函数,我想在不将其添加为底部的字符串的情况下将其包含在内,如下所示:
code += @"public void Write(string path, object thevar)
{
if (thevar.GetType() == typeof(string))
{
System.IO.File.WriteAllText(path,(string)thevar);
}
if (thevar.GetType() == typeof(string[]))
{
System.IO.File.WriteAllLines(path,(string[])thevar);
}
}";
我能否以某种方式在 VS 中从我的实际主项目中添加一个类并让已编译的内存代码访问它?无需将其添加为字符串。
【问题讨论】:
-
您不能将现有程序集添加为引用吗?此外,使用 Roslyn 这应该更容易。 Codedom 并不完全是现代的。
-
关于堆栈溢出的使用,您的新问题更容易理解。我建议删除旧的并将第一段放在这里。
-
如果我理解正确,而不是像你那样调用
Invoke,你可以将GetMethod(一个MethodInfo对象)的结果传递给你的类并让it 呼叫Invoke。是这个意思吗? -
我认为他实际上是指添加一个类文件作为已编译代码的可访问引用,就像您可以将编译器的字符串添加到添加类一样。不知道我会怎么做