动态编译 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。
我会尽可能清楚地定义我的问题,不要忘记任何事情。
对于使用 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。