Могу ли я добавить пустоту в Тип с кодом - PullRequest
0 голосов
/ 11 августа 2011

У меня есть коды компилятора в моей форме. Вот так

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 из строкового кода. Теперь я хочу добавить пустоту этой сборке и изменить сборку и исходный код (строковый код) Как я могу сделать это?

1 Ответ

0 голосов
/ 11 августа 2011

Единственный известный мне способ добавления методов в существующий тип - это использование класса DynamicMethod, который находится в System.Reflection.Emit. Вы можете получить некоторую помощь и пример здесь: http://msdn.microsoft.com/en-us/library/system.reflection.emit.dynamicmethod.aspx,, но это не слишком удобно для пользователя. Если вы хотите создать этот метод, начиная со строки, вам нужно проанализировать строку и преобразовать ее в серии вызовов Emit с соответствующими кодами операций. Я думаю, что вы могли бы намного проще воссоздать вашу сборку с обновленным / добавленным кодом.

Если вам необходимо применить вновь добавленный метод к существующему экземпляру вашего класса, я бы создал новую сборку, создал новый экземпляр нового класса, а затем скопировал старые значения для свойств с помощью отражения. *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...