首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CodeDom :编译部分类

CodeDom :编译部分类
EN

Stack Overflow用户
提问于 2010-04-24 06:17:36
回答 2查看 1.5K关注 0票数 3

我试图在文本文件中编译代码,以在TextBox应用程序的主要形式上更改WinForms中的值。即。向调用窗体添加另一个具有方法的分部类。表单有一个按钮(button1)和一个TextBox (textBox1)。

文本文件中的代码是:

World.textBox1.Text= "Hello!!“

守则如下:

代码语言:javascript
复制
namespace WinFormCodeCompile
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Load code from file
            StreamReader sReader = new StreamReader(@"Code.txt");
            string input = sReader.ReadToEnd();
            sReader.Close();

            // Code literal
            string code =
                @"using System;
                  using System.Windows.Forms;

                  namespace WinFormCodeCompile
                  {
                      public partial class Form1 : Form
                      {

                           public void UpdateText()
                           {" + input + @"
                           }
                       }
                   }";

            // Compile code
            CSharpCodeProvider cProv = new CSharpCodeProvider();
            CompilerParameters cParams = new CompilerParameters();
            cParams.ReferencedAssemblies.Add("mscorlib.dll");
            cParams.ReferencedAssemblies.Add("System.dll");
            cParams.ReferencedAssemblies.Add("System.Windows.Forms.dll");
            cParams.GenerateExecutable = false;
            cParams.GenerateInMemory = true;

            CompilerResults cResults = cProv.CompileAssemblyFromSource(cParams, code);

            // Check for errors
            if (cResults.Errors.Count != 0)
            {
                foreach (var er in cResults.Errors)
                {
                    MessageBox.Show(er.ToString());
                }
            }
            else
            {
                // Attempt to execute method.
                object obj = cResults.CompiledAssembly.CreateInstance("WinFormCodeCompile.Form1");
                Type t = obj.GetType();
                t.InvokeMember("UpdateText", BindingFlags.InvokeMethod, null, obj, null);
            }


        }
    }
}

当我编译代码时,CompilerResults返回一个错误,即WinFormCodeCompile.Form1不包含textBox1的定义。

是否有方法动态地为调用程序集创建另一个部分类文件并执行该代码?

我想我错过了一些很简单的东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-24 06:22:09

部分类不能跨越程序集-程序集是编译的单元,部分类一旦编译就变成了一个类(在CLR级别上没有等效的概念)。

票数 5
EN

Stack Overflow用户

发布于 2010-04-24 06:38:06

您可以尝试使用参数传递要操作的对象,例如:

代码语言:javascript
复制
// etc
public void UpdateText(object passBox)
{" + input + @" }
// more etc
t.InvokeMember("UpdateText", BindingFlags.InvokeMethod, null, obj, new object[] { this.textbox });

这样,代码片段就会产生如下结果:

代码语言:javascript
复制
(passBox as TextBox).Text = "Hello World!!";
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2703439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档