使用表达式树调用不安全的方法

时间:2014-03-18 12:25:22

标签: c# reflection expression-trees unsafe

我需要调用带有原始指针的unsafe方法。

为此,我需要构建Expression来表示指向由VariableExpressionParameterExpression表示的值的指针。

怎么做?

2 个答案:

答案 0 :(得分:9)

我对Expression的常用方法是让C#编译器为我构建Expression,具有出色的lambda解析能力,然后检查它在调试器中的作用。但是,根据您描述的方案,我们几乎立即遇到了问题:

新项目,设置'允许不安全'上。

采用原始指针的方法:

class MyClass
{
    public unsafe int MyMethod(int* p)
    {
        return 0;
    }
}

构建表达式的代码:

class Program
{
    unsafe static void Main(string[] args)
    {
        var mi = typeof (MyClass).GetMethods().First(m => m.Name == "MyMethod");

        int q = 5;

        Expression<Func<MyClass, int, int>> expr = (c, i) => c.MyMethod(&i);

    }
}

我的目的是运行它,看看调试器中expr的样子;但是,当我编译时,我得到了

  

错误CS1944:表达式树可能不包含不安全的指针操作

回顾the docs for this error,看起来你需要构建表示值的指针&#34;永远不会满足:

  

表达式树可能不包含不安全的指针操作

     

表达式树不支持指针类型,因为   Expression<TDelegate>.Compile方法只允许生成   可验证的代码。看评论。 [似乎没有任何   评论!]

     

更正此错误

     
      
  • 尝试创建表达式树时,请勿使用指针类型。
  •   

答案 1 :(得分:2)

我认为AakashM的答案很有用(利用编译器构建表达式树的想法),所以不需要重复它。

但是,我不认为使用指针是完全不可能的:如果你没有取消引用指针,你可以传递它们存储在IntPtr中。您可以在安全代码中使用和传递IntPtr,因此在表达式树中使用它们也应该没有问题。