我想使用CodeDom技术。但是,我找不到阻止引用程序集到动态代码的正确方法。如果我只写简单的声明代码(e.x return "test"
),一切都会好的。但是当我想使用MessabeBox编译器时,结果错误包含The name 'MessageBox' does not exist in the current context
StringBuilder sbCode = new StringBuilder();
sbCode.Append("public class Test {");
sbCode.Append(tbCode.Text);
sbCode.Append("}");
var cp = new CompilerParameters()
{
GenerateInMemory = true,
GenerateExecutable = false,
ReferencedAssemblies =
{
"System.dll",
"System.Core.dll",
"System.Windows.dll",
"System.Windows.Forms.dll"
}
};
using (CSharpCodeProvider codeProvider = new CSharpCodeProvider())
{
CompilerResults res = codeProvider.CompileAssemblyFromSource(cp, sbCode.ToString());
var type = res.CompiledAssembly.GetType("Test");
var obj = Activator.CreateInstance(type);
var output = type.GetMethod("Execute").Invoke(obj, new object[] { });
}
这是我在tbCode文本框中编写的示例代码:
public string Execute()
{
MessageBox.Show("adsf");
return "asdf";
}
答案 0 :(得分:2)
您应该添加所需的"使用"在课堂宣言开始时的陈述:
using System.Windows.Forms;
您还可以使用完整命名空间调用MessageBox:
public string Execute()
{
System.Windows.Forms.MessageBox.Show("adsf");
return "asdf";
}