我可以添加一个void的类型与代码



我有一个编译器代码在我的形式像这样

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的过程中对其进行转换。我认为,您可以更容易地重新创建您的程序集与更新/添加的代码。

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

相关内容

  • 没有找到相关文章

最新更新