C# 空指针?

C# 空指针?,c#,pointers,delegates,void,C#,Pointers,Delegates,Void,在没有IntPtr或任何本机Win32函数的情况下,是否仍可以调用内存地址(如(void*)f=0xFFFF;)。我需要为可执行加载程序(它是为使用名为COSMOS的开源项目的操作系统)执行此操作。如果不使用Marshal.GetDelegateForFunctionPointer,就无法以正确的C#高级方式执行此操作: [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate void CallMeDelegate(int i);

在没有IntPtr或任何本机Win32函数的情况下,是否仍可以调用内存地址(如(void*)f=0xFFFF;)。我需要为可执行加载程序(它是为使用名为COSMOS的开源项目的操作系统)执行此操作。

如果不使用
Marshal.GetDelegateForFunctionPointer,就无法以正确的C#高级方式执行此操作:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void CallMeDelegate(int i);

CallMeDelegate del = (CallMeDelegate)Marshal.GetDelegateForFunctionPointer(new IntPtr(0xffff), typeof(CallMeDelegate));
请注意,IntPtr不是本机Windows只是因为它的名称:它是当前编译目标(32或64位)的典型指针值


我认为,您不能随意使用该API,因为您必须指定一个调用约定,以便能够在正常的C#委托语法中使用它。让我们高兴的是,Marshal.GetDelegateForFunctionPointer独立于平台为您完成所有脏活

如果不使用
封送。GetDelegateForFunctionPointer
,就无法以正确的C#高级方式执行此操作:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void CallMeDelegate(int i);

CallMeDelegate del = (CallMeDelegate)Marshal.GetDelegateForFunctionPointer(new IntPtr(0xffff), typeof(CallMeDelegate));
请注意,IntPtr不是本机Windows只是因为它的名称:它是当前编译目标(32或64位)的典型指针值


我认为,您不能随意使用该API,因为您必须指定一个调用约定,以便能够在正常的C#委托语法中使用它。让我们高兴的是,Marshal.GetDelegateForFunctionPointer独立于平台为您完成所有脏活

为什么没有
IntPtr
?那么,您希望如何表示指针值?您可以在不安全的代码中使用指针类型变量。我不是这方面的专家,但在
unsafe
块中可能会使用指针类型变量。(而且)我不能使用IntPtr,因为我使用的是本机C#编译器,它没有大多数.NET框架的实现,包括IntPtrs@user1454902C#有一个指针类型,名为
IntPtr
。它是用来表示指针/内存地址的类型,它正是您所需要的。故事结束了。如果你的坏编译器没有实现对它的支持,那么问正确的问题。不要问C#支持什么,因为这显然无关紧要。询问你的坏编译器支持什么。C#没有指针类型,即“无法实现指针的编译器的指针”,为什么没有
IntPtr
?那么,您希望如何表示指针值?您可以在不安全的代码中使用指针类型变量。我不是这方面的专家,但在
unsafe
块中可能会使用指针类型变量。(而且)我不能使用IntPtr,因为我使用的是本机C#编译器,它没有大多数.NET框架的实现,包括IntPtrs@user1454902C#有一个指针类型,名为
IntPtr
。它是用来表示指针/内存地址的类型,它正是您所需要的。故事结束了。如果你的坏编译器没有实现对它的支持,那么问正确的问题。不要问C#支持什么,因为这显然无关紧要。询问你的坏编译器支持什么。C#没有指针类型,即“未能实现指针的编译器的指针”,关于OP对有关其编译器的问题所作的最后评论:忽略我的答案。但是在编译器中实现IntPtr不是更容易吗?否则你必须求助于ASM/寄存器操作,我想…关于OP对编译器问题的最后评论:忽略我的答案。但是在编译器中实现IntPtr不是更容易吗?否则,我想你必须求助于ASM/寄存器操作。。。