如何在c#中打印方法的地址?

如何在c#中打印方法的地址?,c#,c,C#,C,在C编程中 void foo() { } void main() { printf("%p",foo); } 将打印foo函数的地址。 请告诉我是否有办法在C#中实现同样的效果。C#是一种高级语言。方法不需要有“地址”——这是留给运行时的实现细节 但是,如果需要与需要方法地址的C代码接口(例如,提供对Windows API方法的回调),则可以 创建一个委托并 检索指向该委托的函数指针 例如: static void foo() { } static void Main(string[

在C编程中

void foo()
{
}
void main()
{
  printf("%p",foo);
}
将打印foo函数的地址。 请告诉我是否有办法在C#中实现同样的效果。

C#是一种高级语言。方法不需要有“地址”——这是留给运行时的实现细节

但是,如果需要与需要方法地址的C代码接口(例如,提供对Windows API方法的回调),则可以

  • 创建一个委托并
  • 检索指向该委托的函数指针
例如:

static void foo()
{
}

static void Main(string[] args)
{
    Delegate fooDelegate = new Action(foo);

    IntPtr p = Marshal.GetFunctionPointerForDelegate(fooDelegate);

    Console.WriteLine(p);
}
但是请注意,您通常不需要这个。即使对于前面提到的示例(将回调传递给Windows API函数),也有一些


更新2021:C#9现在支持不安全代码:

static void Foo() { }

static void Main(string[] args)
{
    unsafe
    {
        delegate*<void> ptrFoo = &Foo;
        Console.WriteLine((long)ptrFoo);
    }
}
static void Foo(){}
静态void Main(字符串[]参数)
{
不安全的
{
委托*ptrFoo=&Foo;
Console.WriteLine((长)ptrFoo);
}
}

在C#方法中不提供地址。在C语言中,方法地址可用于创建指向函数的指针,这些函数可通过将函数传递给接受这些指针的函数来交替调用函数。在C#中,您可以使用类型安全的委托实现相同的功能,这些委托也可以包含多个函数…

您需要地址的实际值有什么特殊原因吗?我试图利用C#中的缓冲区溢出。我是外行。我想这就是为什么你不能这么做的原因。:)2021年,使用C#9,现在有了一种获取函数地址的方法。我已经更新了我的答案。一个代表将需要一些东西,ehr,指向实际的方法。这不会返回“新操作”的地址,而是将内部地址存储到“新操作”的代表。“p”指针将是指向新操作的委托的指针-因此它将是远离搜索地址的调用。我想这就是@AdasLesniak所说的,但要清楚,你实际上无法通过这种方式获得类方法的地址。我不确定是否有任何方法可以做到这一点,或者你是否可以利用这个地址做任何有用的事情,即使你可以。如果你想从非托管C++调用C.Y.Ay方法,COM互操作是最好的方法,并为你处理这些。当然,方法也有地址。否则COM互操作将无法工作。直接获得它们几乎是不可能的。您可能是对的,它是特定于实现的,但我希望看到一个不在内存中存储代码的实现。@Petermore:我还没有检查规范是否允许这样做,但我认为编译器或JITter可以先内联,然后完全删除私有或内部方法。如果是这样的话,这个方法就真的没有地址了。哇,你让我大吃一惊——一个方法本身在被调用后的某个时候得到了GC?我想这是可能的,但听起来很疯狂。想起来让我头疼。我确实知道的是,如果您获得了托管对象的IUnknown,那么这些方法是JIT的,并且作为本机代码存在于RAM中,否则C/C++将无法使用该接口。所以我只是说,从理论上讲,获得物理地址是可能的,但我想我们都同意,这充其量是极其困难和毫无意义的。