/// <summary>
/// 获得默认的DLL引用
/// </summary>
/// <returns></returns>
public static List<string> GetStaticListDLL()
{
List<string> theResult = new List<string>();
theResult.Add("System.dll");
theResult.Add("System.Web.dll");
theResult.Add("System.Data.dll");
return theResult;
}
/// <summary>
/// 动态程序调用
/// </summary>
/// <param name="code"></param>
/// <param name="listDLL"></param>
/// <param name="createInstanceName"></param>
/// <param name="methodName"></param>
/// <param name="IsStaticMethod"></param>
/// <param name="p"></param>
/// <returns></returns>
public static object Call
(
string code,
List<string> listDLL,
string createInstanceName,
string methodName,
bool IsStaticMethod,
object[] p
)
{
return Call(code, listDLL, false, true, createInstanceName, methodName, IsStaticMethod, p);
}
/// <summary>
/// 动态程序调用
/// </summary>
/// <param name="code">CS代码</param>
/// <param name="listDLL">引入的DLL</param>
/// <param name="GenerateExecutable">获取或设置一个值,该值指示是否生成可执行文件</param>
/// <param name="GenerateInMemory">获取或设置一个值,该值指示是否在内存中生成输出</param>
/// <param name="createInstanceName">类实体</param>
/// <param name="methodName">方法名</param>
/// <param name="IsStaticMethod">是否静态方法</param>
/// <param name="p">参数</param>
/// <returns></returns>
public static object Call
(
string code,
List<string> listDLL,
bool generateExecutable,
bool generateInMemory,
string createInstanceName,
string methodName,
bool IsStaticMethod,
object[] p
)
{
// 1.CSharpCodePrivoder
// using Microsoft.CSharp
CSharpCodeProvider objCSharpCodePrivoder
=
new CSharpCodeProvider();
// 2.ICodeComplier
// using System.CodeDom.Compiler
ICodeCompiler objICodeCompiler
=
objCSharpCodePrivoder.CreateCompiler();
// 3.CompilerParameters
//
CompilerParameters objCompilerParameters
=
new CompilerParameters();
if (listDLL != null)
{
foreach (string s in listDLL)
{
objCompilerParameters.ReferencedAssemblies.Add(s);
}
}
// 获取或设置一个值,该值指示是否生成可执行文件。
objCompilerParameters.GenerateExecutable
=
generateExecutable;
// 获取或设置一个值,该值指示是否在内存中生成输出。
objCompilerParameters.GenerateInMemory
=
generateInMemory;
// 4.CompilerResults
CompilerResults cr
=
objICodeCompiler.CompileAssemblyFromSource
(
objCompilerParameters,
code
);
if (cr.Errors.HasErrors)
{
StringBuilder errorSB = new StringBuilder();
errorSB.AppendLine("代码:");
errorSB.AppendLine(code);
errorSB.AppendLine();
errorSB.AppendLine("编译错误:");
foreach (CompilerError err in cr.Errors)
{
errorSB.AppendLine(err.ErrorText);
}
throw new Exception(errorSB.ToString());
}
else
{
// 通过反射,调用的实例
Assembly objAssembly
=
cr.CompiledAssembly;
// 创建
object theInstance
=
objAssembly.CreateInstance(createInstanceName);
// 反射获得方法 //
MethodInfo methodItem
=
theInstance.GetType().GetMethod(methodName);
return methodItem.Invoke(theInstance, p);
}
}
测试要执行的代码:
using System;
namespace SlowX.CSharpCodeProviderDemo
{
public class Demo
{
public static int Add(int one, int two)
{
return one + two;
}
}
}
调用方式(调用 SlowX.CSharpCodeProviderDemo.Demo类里面的Add方法,执行2+5的操作):
try
{
List<string> listDLL = new List<string>();
listDLL.Add("System.dll");
object[] p =new object[]{2,5};
lt_Result.Text = Call
(
GetCode(),
listDLL,
false,
true,
"SlowX.CSharpCodeProviderDemo.Demo",
"Add",
true,
p
).ToString();
}
catch (Exception err)
{
lt_Result.Text = "发生异常:" + err.Message;
}