【问题标题】:Passing and using a list in CodeDom dynamic method在 CodeDom 动态方法中传递和使用列表
【发布时间】:2014-03-13 04:18:40
【问题描述】:

我正在尝试使用一个简单的静态方法来返回一个对象来动态评估一个表达式。我已遵循此处示例中概述的建议:http://www.blackwasp.co.uk/RuntimeCompilation_2.aspx

对于基本表达式,这可以正常工作,但对于涉及 .Contains() 方法的表达式,我会抛出异常。

工作电话:

Console.WriteLine(DynamicCodeUtils.TestExpression("1 == 1 && (2 == 3 || 2 == 2) && 4 == 5");
Output: false

Console.WriteLine(DynamicCodeUtils.TestExpression("Math.Max(100,200)"));
Output: 200

非工作电话:

string _ArrayCheck = "\"1,2,3\".Split(',').ToArray().Contains(\"1\")";
Console.WriteLine(DynamicCodeUtils.TestExpression(_ArrayCheck));

Throws an exception - expected output would be "true"

代码:

public static object TestExpression(string Expression)
    {
        CSharpCodeProvider provider = new CSharpCodeProvider();
        CompilerParameters parameters = new CompilerParameters();
        parameters.GenerateExecutable = false;
        parameters.GenerateInMemory = true;
        parameters.ReferencedAssemblies.Add("System.dll");
        parameters.ReferencedAssemblies.Add("System.Xml.dll");
        parameters.ReferencedAssemblies.Add("System.Xml.Linq.dll");
        CompilerResults results = provider.CompileAssemblyFromSource(parameters, GetCode(Expression));

        var cls = results.CompiledAssembly.GetType("DynamicNS.DynamicCode");
        var method = cls.GetMethod("DynamicMethod", BindingFlags.Static | BindingFlags.Public);
        return method.Invoke(null, null);
    }

public static string[] GetCode(string Expression)
    {
        return new string[]
        {
            @"
            using System;
            using System.Linq;

            namespace DynamicNS
            {
                public static class DynamicCode
                {
                    public static object DynamicMethod()
                    {
                        return " + Expression + @";
                    }
                }
            }"
        };
    }

【问题讨论】:

    标签: c# assemblies codedom csharpcodeprovider


    【解决方案1】:

    CompilerResults 类型包含属性Errors。如果你往里看,你会发现:

    错误 CS0234:命名空间“System”中不存在类型或命名空间名称“Linq”(您是否缺少程序集引用?)

    这是因为System.Linq 命名空间中的类型(如Enumerable)在System.Core.dll 程序集中。如果您添加它,那么您的代码将开始工作:

    parameters.ReferencedAssemblies.Add("System.Core.dll");
    

    【讨论】:

    • 非常感谢...我一直在尝试添加/删除无数引用,但找不到正确的组合。现在工作完美无缺。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2016-07-08
    • 1970-01-01
    相关资源
    最近更新 更多