我的表单中有一个编译器代码,就像这样
Assembly BuildAssembly(string code)
{
List<string> SKParams = new List<string>();
string Caption = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\";
SKParams.Add(Caption + "System" + ".dll");
SKParams.Add(Caption + "System.Windows.Forms" + ".dll");
SKParams.Add(Caption + "System.Data" + ".dll");
SKParams.Add(Caption + "System.Core" + ".dll");
SKParams.Add(Caption + "System.Drawing" + ".dll");
SKParams.Add(Caption + "System.Drawing" + ".dll");
SKParams.Add(@"D:\SK\Projelerim\ZxProject\MySDK\MySDK\bin\Debug\MySDK.dll");
SKParams.Add(Caption + "System.XML" + ".dll");
Microsoft.CSharp.CSharpCodeProvider provider = new CSharpCodeProvider();
ICodeCompiler compiler = provider.CreateCompiler();
CompilerParameters compilerparams = new CompilerParameters(SKParams.ToArray());
compilerparams.GenerateExecutable = false;
compilerparams.GenerateInMemory = true;
CompilerResults results = compiler.CompileAssemblyFromSource(compilerparams, code);
if (results.Errors.HasErrors)
{
StringBuilder errors = new StringBuilder("Compiler Errors :\r\n");
foreach (CompilerError error in results.Errors)
{
errors.AppendFormat("Line {0},{1}\t: {2}\n",
error.Line, error.Column, error.ErrorText);
MessageBox.Show(error.ErrorText);
}
throw new Exception(errors.ToString());
}
else
{
return results.CompiledAssembly;
}
}
我正在从字符串代码中获取这个MEthod的汇编。现在我想添加一个void汇编并更改汇编和源代码(字符串代码)我该如何制作?
答案 0 :(得分:0)
我知道将方法添加到现有类型的唯一方法是使用您在System.Reflection.Emit中找到的DynamicMethod类。您可以在这里获得一些帮助和示例:http://msdn.microsoft.com/en-us/library/system.reflection.emit.dynamicmethod.aspx,但它不太友好。如果要从字符串开始创建此方法,则必须解析字符串并将其转换为使用相应OpCode对Emit进行的一系列调用。我认为您可以使用更新/添加的代码更轻松地重新创建程序集。
如果您必须将新添加的方法应用于类的现有实例,我将创建新程序集,创建新类的新实例,然后通过反射复制属性的旧值。