我会尝试尽可能地定义我的问题而忘记一切。
对于我使用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.
}
答案 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。