我可以在Type with Code中添加一个void

时间:2011-08-11 09:12:37

标签: c# reflection

我的表单中有一个编译器代码,就像这样

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汇编并更改汇编和源代码(字符串代码)我该如何制作?

1 个答案:

答案 0 :(得分:0)

我知道将方法添加到现有类型的唯一方法是使用您在System.Reflection.Emit中找到的DynamicMethod类。您可以在这里获得一些帮助和示例:http://msdn.microsoft.com/en-us/library/system.reflection.emit.dynamicmethod.aspx,但它不太友好。如果要从字符串开始创建此方法,则必须解析字符串并将其转换为使用相应OpCode对Emit进行的一系列调用。我认为您可以使用更新/添加的代码更轻松地重新创建程序集。

如果您必须将新添加的方法应用于类的现有实例,我将创建新程序集,创建新类的新实例,然后通过反射复制属性的旧值。