从string调用代码。参数不被接受

时间:2013-12-20 08:13:07

标签: c# invoke

我希望调用所选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

1 个答案:

答案 0 :(得分:3)

您尚未包含对当前程序集的引用,即程序集声明 Global。因此,编译器不知道您正在谈论哪种类型。

您需要在正在创建的CompilerParameters中设置ReferencedAssemblies属性。