我想动态生成一个string的语句: 
    frmEmployee frm=new frm; 
    frm.show();  
其中 frmEmployee是用参数传进去的,请问这个string 的语名怎么写?===========================下面的方法可以执行组合的string源码======================================
  private void method_test(string ACode)
        {
            ICodeCompiler vCodeCompiler = new CSharpCodeProvider().CreateCompiler();
            CompilerParameters vCompilerParameters = new CompilerParameters();
            vCompilerParameters.GenerateExecutable = false;
            vCompilerParameters.GenerateInMemory = true;
            vCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
            string vSource =
                "using System.Windows.Forms;\n" +
                "public class Temp\n" +
                "{\n" +
                "    public void Test()\n" +
                "    {\n" +
                "         " + ACode + "\n" +
                "    }\n" +
                "}\n";
            CompilerResults vCompilerResults =
                vCodeCompiler.CompileAssemblyFromSource(vCompilerParameters, vSource);
 
            Assembly vAssembly = vCompilerResults.CompiledAssembly;
            object vTemp = vAssembly.CreateInstance("Temp");
            MethodInfo vTest = vTemp.GetType().GetMethod("Test");
            vTest.Invoke(vTemp, null);
        }
 =========================================
就是不知道把中间那个vSource 的值换为:
 frmEmployee frm=new frm; 
    frm.show();  
怎么去写.....

解决方案 »

  1.   

    你frmEmployee 这个类都写不进去
      

  2.   

    参考如下代码实现// 动态调静态private void button1_Click(object sender, EventArgs e)
    {
        ICodeCompiler vCodeCompiler = new CSharpCodeProvider().CreateCompiler();
        CompilerParameters vCompilerParameters = new CompilerParameters();
        vCompilerParameters.GenerateExecutable = false;
        vCompilerParameters.GenerateInMemory = true;    vCompilerParameters.ReferencedAssemblies.Add(GetType().Module.FullyQualifiedName); //<<<<<<<<<<添加模块文件路径
        vCompilerParameters.ReferencedAssemblies.Add("System.dll"); 
        vCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll"); 
        
        string vSource =
            "using " + GetType().Namespace + ";\n" + // 引用命名空间
            "using System.ComponentModel;\n" + 
            "using System.Windows.Forms;\n" +
            "public class Temp\n" +
            "{\n" +
            "    public void Test()\n" +
            "    {\n" +
            "         new " + GetType().Name + "().Show();" + // 生成类实例
            "    }\n" +
            "}\n";
        Console.WriteLine(typeof(Component).Module.FullyQualifiedName);
        CompilerResults vCompilerResults =
            vCodeCompiler.CompileAssemblyFromSource(vCompilerParameters, vSource);
        if (vCompilerResults.Errors.Count > 0)
        {
            foreach (CompilerError vCompilerError in vCompilerResults.Errors)
            {
                Console.WriteLine("错误:" + vCompilerError.ErrorText);
            }
            return;
        }    Assembly vAssembly = vCompilerResults.CompiledAssembly;
        object vTemp = vAssembly.CreateInstance("Temp");
        MethodInfo vTest = vTemp.GetType().GetMethod("Test");
        vTest.Invoke(vTemp, null);
    }
      

  3.   

    2.0不用ICodeCompiler了, 直接CompilerResults vCompilerResults =
                    CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(vCompilerParameters, vSource);
      

  4.   

    感谢楼上LeoMaya指点,修改后调试通过
      

  5.   

    Top  
     zswang(伴水清清)(专家门诊清洁工) ( ) 信誉:100    Blog   加为好友  2007-5-29 18:09:39  得分: 0  
     
     
       
    这代码很熟悉,-_-!!! 好象是我写的=================================================
    没错,就是抄你的....但是我还是没搞懂....=============================下面是我的代码....       private void Execute_Method(string ACode)
            {
                ICodeCompiler vCodeCompiler = new CSharpCodeProvider().CreateCompiler();
                CompilerParameters vCompilerParameters = new CompilerParameters();
                vCompilerParameters.GenerateExecutable = false;
                vCompilerParameters.GenerateInMemory = true;            vCompilerParameters.ReferencedAssemblies.Add(GetType().Module.FullyQualifiedName); //<<<<<<<<<<添加模块文件路径
                vCompilerParameters.ReferencedAssemblies.Add("System.dll");
                vCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");            string vSource =
                    "using " + GetType().Namespace + ";\n" + // 引用命名空间
                    "using System.ComponentModel;\n" +
                    "using System.Windows.Forms;\n" +
                    "public class Temp\n" +
                    "{\n" +
                    "    public void Test()\n" +
                    "    {\n" +
                    "         new " + GetType().Name + "().Show();" + // 生成类实例
                    "    }\n" +
                    "}\n";
                CompilerResults vCompilerResults =
                    CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(vCompilerParameters, vSource);            if (vCompilerResults.Errors.Count > 0)
                {
                    foreach (CompilerError vCompilerError in vCompilerResults.Errors)
                    {
                        Console.WriteLine("错误:" + vCompilerError.ErrorText);
                    }
                    return;
                }            Assembly vAssembly = vCompilerResults.CompiledAssembly;
                object vTemp = vAssembly.CreateInstance("Temp");
                MethodInfo vTest = vTemp.GetType().GetMethod("Test");
                vTest.Invoke(vTemp, null);        }     
            private void button1_Click(object sender, EventArgs e)
            {
                this.Execute_Method("frmEmployee");
            }这段代码是在 frmMain中的,现在的情况是点Button后实例化打开了一个frmMain,我想打开的是我传进去的那个参数的窗体==> frmEmployee ?如何来改?
      
      

  6.   

    要确定frmEmployee所在模块的路径 //假设在@"c:\temp\temp.dll"
    frmEmployee所在的命名空间 //假设是"tempspace"vCompilerParameters.ReferencedAssemblies.Add(@"c:\temp\temp.dll"); //<<<添加模块文件路径 "using tempspace;\n" + // 引用命名空间"         new frmEmployee().Show();" + // 生成类实例