动态执行CS代码的方法

2017-02-20 00:32:39  访问(1463) 赞(0) 踩(0)


///
/// 获得默认的DLL引用
///

///
public static List GetStaticListDLL()
{
List theResult = new List();

theResult.Add("System.dll");
theResult.Add("System.Web.dll");
theResult.Add("System.Data.dll");

return theResult;
}


///
/// 动态程序调用
///

///
///
///
///
///
///
///
public static object Call
(
string code,
List listDLL,
string createInstanceName,
string methodName,
bool IsStaticMethod,
object[] p
)
{
return Call(code, listDLL, false, true, createInstanceName, methodName, IsStaticMethod, p);
}

///
/// 动态程序调用
///

/// CS代码
/// 引入的DLL
/// 获取或设置一个值,该值指示是否生成可执行文件
/// 获取或设置一个值,该值指示是否在内存中生成输出
/// 类实体
/// 方法名
/// 是否静态方法
/// 参数
///
public static object Call
(
string code,
List 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);
}
}
标签:动态执行CS代码的方法 

上一条:

下一条:


 

相关评论

评论加载中……
 

发表评论

类型:
内容:
  (Alt+Enter)
 
  ┈全部┈  
 
(显示默认分类)