以下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/