我希望调用所选txt文件中的代码。它工作正常,直到文件内容像“文本字符串”这样简单。如果我将字符串参数传递给它,它也可以工作。但是当我尝试传递像我的情况一样的对象时,它失败了。错误是:“找不到类型或命名空间名称'Global'(您是否缺少using指令或程序集引用?)” 这是一些代码..
private void button1_Click(object sender, EventArgs e)
{
Scripting scriptObj = new Scripting();
scriptObj.fileName = this.openFileDialog1.FileName;
scriptObj.tekst = File.ReadAllText(this.openFileDialog1.FileName);
string exit = scriptObj.GetAction();
this.label1.Text = exit;
}
namespace WindowsFormsApplication2
{
public class Global
{
public string fileName = "test string";
}
public class Scripting
{
public string tekst = "";
public string fileName = "";
public string MyMethod1(Global obj) { return (obj.fileName); }
public string GetAction()
{
string sourceCode = @" namespace WindowsFormsApplication2 { public class Scripting { public string MyMethod (Global obj) { return (" + tekst + "); }}}";
var compParms = new CompilerParameters
{
GenerateExecutable = false,
GenerateInMemory = true
};
var csProvider = new CSharpCodeProvider();
CompilerResults compilerResults = csProvider.CompileAssemblyFromSource(compParms, sourceCode);
if (compilerResults.Errors.HasErrors)
{
StringBuilder errors = new StringBuilder("Compiler Errors :\r\n");
foreach (CompilerError error in compilerResults.Errors)
{
errors.AppendFormat("Line {0},{1}\t: {2}\n",
error.Line, error.Column, error.ErrorText);
}
return errors.ToString();
}
else
{
Global newGlobal = new Global();
newGlobal.fileName = "TEsTfileNameToOutput";
object typeInstance = compilerResults.CompiledAssembly.CreateInstance("WindowsFormsApplication2.Scripting");
MethodInfo mi = typeInstance.GetType().GetMethod("MyMethod");
string methodOutput = (string)mi.Invoke(typeInstance, new object[]{ newGlobal });
return methodOutput;
}
}
}
}
为什么
public string MyMethod (Global obj) { return (" + tekst + "); }
不要将Global视为参数,但它可以与MyMethod1一起使用
public string MyMethod1(Global obj) { return (obj.fileName); }
所选文件的内容为:obj.fileName
答案 0 :(得分:3)
您尚未包含对当前程序集的引用,即程序集声明 Global
。因此,编译器不知道您正在谈论哪种类型。
您需要在正在创建的CompilerParameters
中设置ReferencedAssemblies
属性。