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

C# 使用表达式树调用不安全的方法,c#,reflection,expression-trees,unsafe,C#,Reflection,Expression Trees,Unsafe,我需要调用接受原始指针的unsafe方法 为此,我需要构造表达式,它表示指向变量表达式或参数表达式表示的值的指针 如何做到这一点?我处理表达式的常用方法是让C#编译器为我构建表达式,它具有出色的lambda解析能力,然后检查它在调试器中的性能。然而,在您描述的场景中,我们几乎立刻遇到了一个问题: 新建项目,在上设置“允许不安全” 获取原始指针的方法: class MyClass { public unsafe int MyMethod(int* p) { retu

我需要调用接受原始指针的
unsafe
方法

为此,我需要构造
表达式
,它表示指向
变量表达式
参数表达式
表示的值的指针


如何做到这一点?

我处理
表达式的常用方法是让C#编译器为我构建
表达式,它具有出色的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);

    }
}
类程序
{
不安全的静态void Main(字符串[]args)
{
var mi=typeof(MyClass).GetMethods().First(m=>m.Name==“MyMethod”);
int q=5;
表达式expr=(c,i)=>c.MyMethod(&i);
}
}
我的目的是运行它,看看调试器中的
expr
是什么样子;然而,当我编译时,我得到了

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

回顾一下,您的“需要构造表示指向值的指针的表达式”似乎永远无法满足:

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

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

要更正此错误

  • 尝试创建表达式树时不要使用指针类型

我认为AakashM的答案是有用的(利用编译器构建表达式树的想法),因此无需重复


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

我认为这个问题非常有趣,而且对于能够回答这个问题的人来说,有很多详细的说明。我要看这个。“我想这会是个问题吗?”劳埃德一点也不担心。谢谢@AakashM^你为什么不回答这个问题呢?