动态编译NullReferenceException错误

时间:2016-02-12 13:49:17

标签: c# linq compiler-construction webrequest codedom

我会尝试尽可能地定义我的问题而忘记一切。

对于我使用webRequest的项目,我想动态编译我的webRequest。 为此,我在一个私有程序集中使用了CodeDomProvider,并使用了一个公共MethodInfo,它给了我一个"方法"我可以在我的主程序中使用。 所以主要的问题是在我的CompileCode中,我的MethodInfo方法= type.getMethod(functionname);给我一个NullReferenceException错误。我知道这是因为我的type.getMethod(functionname)不能处理null类型。我试图修改我的对象实例和类型类型不为空的事实,但我不能因为性别而给它们值,而我却陷入了这样一个事实,即它们保持为空并且没有给我任何价值......

我也看到很多人使用Linq,但是当我编译一个完整的.cs文件时,我不能用@"使用System.Linq编写所有内容;&#34 ;;

所以这里的部分代码是问题所在:

谢谢

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.
}

1 个答案:

答案 0 :(得分:0)

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