动态编译 NullReferenceException 错误

Dynamic Compilation NullReferenceException error

我会尽可能清楚地定义我的问题,不要忘记任何事情。

对于使用 webRequest 的项目,我想动态编译我的 webRequest。 为此,我在私有程序集中使用了 CodeDomProvider,并使用 public MethodInfo 返回了一个可以在我的主程序中使用的“方法”。 所以主要问题是在我的 CompileCode 中,我的 MethodInfo 方法 = type.getMethod(functionname);给我一个 NullReferenceException 错误。我知道这是因为我的 type.getMethod(functionname) 不能在 null 类型上工作。我试图修改我的对象实例和 Type 类型不为 null 的事实,但由于它们的性别,我不能给它们赋值,我陷入了它们保持为 null 并且没有给我任何值的事实中...

我也看到很多人用Linq,但是我编译的是整个.cs文件,我不能用@"using System.Linq;"这样写;

这里是部分代码,问题是:

谢谢

namespace testCodeCompiler
{
    public class CodeCompiler
    {
    public CodeCompiler()
    {
    }
    public MethodInfo CompileCode(string code, string namespacename, string classname,string functionname, bool isstatic, params object[] args)
    {
        Assembly asm = BuildAssembly(code);
        object instance = null;
        Type type = null;
        if (isstatic)
        {
            type = asm.GetType(namespacename + "." + classname);
        }
        else
        {
            instance = asm.CreateInstance(namespacename + "." + classname);
            type = instance.GetType();
        }
        MethodInfo method = type.GetMethod(functionname); // here is the error
        return method;
    }

    private Assembly BuildAssembly(string code)
    {
        CSharpCodeProvider provider = new CSharpCodeProvider();
        CompilerParameters compilerparams = new CompilerParameters();
        compilerparams.GenerateExecutable = false;
        compilerparams.GenerateInMemory = true;
        compilerparams.ReferencedAssemblies.Add("System.dll");
        compilerparams.ReferencedAssemblies.Add("System.Xml.dll");
        System.Reflection.Assembly currentAssembly = System.Reflection.Assembly.GetExecutingAssembly();
        compilerparams.ReferencedAssemblies.Add(currentAssembly.Location);
        CompilerResults results = provider.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);
            }
            throw new Exception(errors.ToString());
        }
        else
        {
            return results.CompiledAssembly;
        }
    }
}

还有 Main() 的一小部分:

static void Main(string[] args)
{
    MethodInfo method;
    [// Little bit of code ]
    StreamReader sr = new StreamReader(@"c:\pathtothefileIwant\File.cs", System.Text.Encoding.Default);
    string file = sr.ReadToEnd();
    sr.Close();
    CodeCompiler cc = new CodeCompiler();

    object[] arguments = { popup }; // here are the args which are in another class
    [...little bit of code...]

    method = cc.CompileCode(file, "testNamespace", "Class1", "webRequest", true, arguments);

     List<Test> li = (List<Test>)method.Invoke(null, arguments); // Here I invoke the method to put it in a List<Compte> I made before.
}

问题出在 class 程序中 主要(){ method = cc.CompileCode(file, "testNamespace", "Class1", "webRequest", true, arguments);} 字符串 classname 不是好字符串,没有指向我要编译的真实文档。好的路径是 method = cc.CompileCode(file,"testNamespace", "WebRequest","webRequest", true, arguments);} 这就是为什么 Type type; 不能得到一些东西而不是 null。