我不能'改变其他类var值与CompileAssemblyFromSource

本文关键字:var 值与 CompileAssemblyFromSource 其他 改变 不能 | 更新日期: 2023-09-27 18:09:14

我尝试使用CompileAssemblyFromSource在我的主类中改变1个值。但是当我编译时,我得到错误"无法加载文件或程序集或其依赖项之一",这只发生在我尝试改变其他类的静态值时。但如果我返回一些输出或写任何东西在控制台从这个FooClass比所有的工作很好。但是我怎样才能改变其他类的值呢?

using System;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.CSharp;
namespace stringToCode
{
    class Program
    {
        public static int q = 0;
        static void Main(string[] args)
        {
            string source = "namespace stringToCode { public class FooClass { public void Execute() { Program.q = 1; } } }";
            Console.WriteLine("q=" + q);
            using (var foo = new CSharpCodeProvider())
            {
                var parameters = new CompilerParameters();
                parameters.GenerateInMemory = true;
                foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
                {
                    try
                    {
                        string location = assembly.Location;
                        if (!String.IsNullOrEmpty(location))
                        {
                            parameters.ReferencedAssemblies.Add(location);
                        }
                    }
                    catch (NotSupportedException)
                    {}
                } 
                var res = foo.CompileAssemblyFromSource(parameters ,source);
                var type = res.CompiledAssembly.GetType("FooClass"); //<- here i has error
                var obj = Activator.CreateInstance(type);
                var output = type.GetMethod("Execute").Invoke(obj, new object[] { });
                Console.WriteLine("q=" + q);
                Console.ReadLine();
            }
        }
    }
}

我不能'改变其他类var值与CompileAssemblyFromSource

找不到类型,因为代码中存在编译错误。您不能以这种方式访问当前代码中的类。您至少应该在您的内存程序集中引用当前程序集。

你的代码中有两个问题。首先,您必须使类Program公开。然后您应该在GetType方法中指定类型的全名。

下面的代码运行正常:

using System;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.CSharp;
namespace stringToCode
{
    public class Program
    {
        public static int q = 0;
        static void Main(string[] args)
        {
            string source = "namespace stringToCode { public class FooClass { public void Execute() { Program.q = 1; } } }";
            Console.WriteLine("q=" + q);
            using (var foo = new CSharpCodeProvider())
            {
                var parameters = new CompilerParameters();
                parameters.GenerateInMemory = true;
                foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
                {
                    try
                    {
                        string location = assembly.Location;
                        if (!String.IsNullOrEmpty(location))
                        {
                            parameters.ReferencedAssemblies.Add(location);
                        }
                    }
                    catch (NotSupportedException)
                    {}
                } 
                var res = foo.CompileAssemblyFromSource(parameters ,source);
                var type = res.CompiledAssembly.GetType("stringToCode.FooClass"); //<- here i has error
                var obj = Activator.CreateInstance(type);
                var output = type.GetMethod("Execute").Invoke(obj, new object[] { });
                Console.WriteLine("q=" + q);
                Console.ReadLine();
            }
        }
    }
}