我有一个编译器代码在我的形式像这样
Assembly BuildAssembly(string code)
{
List<string> SKParams = new List<string>();
string Caption = @"C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.0ProfileClient";
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:SKProjelerimZxProjectMySDKMySDKbinDebugMySDK.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 :rn");
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;
}
}
我从字符串代码中获得这个方法的汇编。现在我想添加一个void这个汇编和更改汇编和源代码(字符串代码)我怎么能做到这一点?
我所知道的向现有类型添加方法的唯一方法是使用System.Reflection.Emit中的DynamicMethod类。您可以在这里获得一些帮助和一个示例:http://msdn.microsoft.com/en-us/library/system.reflection.emit.dynamicmethod.aspx,但它不是太用户友好。如果您想从字符串开始创建这个方法,您必须解析字符串,并在一系列使用适当的OpCodes调用Emit的过程中对其进行转换。我认为,您可以更容易地重新创建您的程序集与更新/添加的代码。
如果您必须将新添加的方法应用于您的类的现有实例,我会创建新的程序集,创建新类的新实例,然后通过反射复制属性的旧值。