日期:2014-05-19  浏览次数:20753 次

<问题的延续> 关于[动态代码]编译后如何实现调用主应用程序里原来的方法!请大家关注...
上一个问题已经解决,地址:http://community.csdn.net/Expert/topic/5516/5516889.xml?temp=.9189264

如题!问题的缘由   请参阅如上地址...

我现在已经通过CodeDom动态的把字符串编译成程序集,并保存在内存当中(可调用)!

现在我想实现的是,在动态生成的[程序集]里面调用主应用程序的方法(注意:这是已编译好的物理文件)...

不知能否实现,请有相关经验的朋友   /   上一贴回答的朋友继续指教...

先谢了...

^o^

------解决方案--------------------
//也不知道这个是不是你想要的,或者是最简单的
//就是实现动态编译的程序回调静态的方法
//抛砖引玉吧

private void MyDelegate(object sender, EventArgs e)
{
MessageBox.Show( "Zswang 路过 ");
}

private void button1_Click(object sender, EventArgs e)
{
ICodeCompiler vCodeCompiler = new CSharpCodeProvider().CreateCompiler();
CompilerParameters vCompilerParameters = new CompilerParameters();
vCompilerParameters.GenerateExecutable = false;
vCompilerParameters.GenerateInMemory = true;

string vSource =
"using System;\n " +
"public class Temp\n " +
"{\n " +
" public EventHandler myDelegate;\n " +
" public void Test()\n " +
" {\n " +
" if (myDelegate != null)\n " +
" myDelegate.Invoke(null, null);\n " +
" }\n " +
"}\n ";
CompilerResults vCompilerResults =
vCodeCompiler.CompileAssemblyFromSource(vCompilerParameters, vSource);

Assembly vAssembly = vCompilerResults.CompiledAssembly;
object vTemp = vAssembly.CreateInstance( "Temp ");
FieldInfo vMyDelegate = vTemp.GetType().GetField( "myDelegate ");
vMyDelegate.SetValue(vTemp, new EventHandler(MyDelegate));
MethodInfo vTest = vTemp.GetType().GetMethod( "Test ");
vTest.Invoke(vTemp, null);
}