如何在 C# 中实现对 codedom 的引用程序集
How to impelement referenced assemblies to codedom in C#
我想使用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";
}
您应该在 class 声明的开头添加所需的 "using" 语句:
using System.Windows.Forms;
您还可以使用完整命名空间调用消息框:
public string Execute()
{
System.Windows.Forms.MessageBox.Show("adsf");
return "asdf";
}
我想使用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";
}
您应该在 class 声明的开头添加所需的 "using" 语句:
using System.Windows.Forms;
您还可以使用完整命名空间调用消息框:
public string Execute()
{
System.Windows.Forms.MessageBox.Show("adsf");
return "asdf";
}