以下IL代码创建一个名为(fnptr)*的Type实例( token 0x2000000-无效,模块mscorlib.dll)。

ldtoken method void* ()*
call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)

这种类型的目的是什么?是否可以在C#中创建这种类型的实例而无需编写任何IL代码,也许可以进行反射? token 上的Module.ResolveType引发ArgumentOutOfRangeException。

编辑:

显然(fnptr)类型是IL方法指针类型的内部CLR类型表示形式,尽管删除最后一个*时,它只是返回IntPtr

编辑#2:
(fnptr)来自可以在SSCLI typestring.cpp中看到的函数:



为什么在typehandle.cpp中可以看到基本的fnptr返回IntPtr的原因:



因此,看起来他们已经忘记修复它了。

最佳答案

我不知道您在问什么以及为什么您认为有什么问题。 (fnptr)*是指向非托管函数指针的指针的类型名称。在CLR中得到特殊处理确实是很奇怪的,我怀疑这是一件考古文物。可以追溯到.NET之前和发明代表之前的时间。 CLR在Project 42(.NET之前的失败项目)中以“通用运行时”开始生活。

也许一些C++/CLI代码演示如何生成一个代码很有用,并向您展示如何创建代码:

#include "stdafx.h"

using namespace System;

typedef void (*functionPointer)(int);

ref class Example {
public:
    functionPointer* fp;
};

int main(array<System::String ^> ^args)
{
    auto field = Example::typeid->GetField("fp");
    auto name = field->FieldType->FullName;
    Console::WriteLine(name);
    return 0;
}

输出:(fnptr)*

关于c# - 什么是(fnptr)*类型以及如何创建它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27195502/

10-12 22:35