Interoping非托管引用或指针

时间:2016-08-30 18:36:50

标签: c# pointers struct

最近,我决定加入钩子功能,我已经用c ++做了,我开始使用自己的程序然后开始在游戏中进行。

由于我是c#的粉丝而且我在很多方面比c ++更喜欢它,所以我决定用c#来做这一切。

这很简单,我在很短的时间内重新创建了几乎我用c ++制作的所有内容(很奇怪)。

我只是遇到了一些问题,而是调用了作为引用/指针传递的非托管函数。

我最终制作了一个c-wrapper,但我想很快就去c#

示例功能:void GetData(Entity& entity, Filter* filter, Data* data)

现在,实体。我试过做ref struct实体。对于其他人,我使用了IntPtr,我传递了Marshal.StructureToPtr(过滤器/数据实例)。

这不起作用,我不知道出了什么问题或什么,但是我非常想知道,我想我需要向更聪明的人询问。

1(eh)更多问题:在C#中,结构/类是如何不同的,c ++中的c#结构是什么?在c#中创建一个带有new的类总是会导致Class *?

1 个答案:

答案 0 :(得分:2)

首先,您为什么要使用IntPtrMarshal.PtrToStructure?有特殊需要吗?如果有特殊需要,请提出这个问题。

或者您只是想改变传递给函数的参数?

如果您只是想更改参数,我建议您查看out(也是see this link)和ref个关键字,以及如何使用它们,链接'获得这些例子也只是彻底阅读。

  

在C#中,struct / class是如何不同的,c ++中的c#结构是什么?在c#中创建一个带有new的类总是会导致Class *?

我不知道为什么,但我觉得你对参考类型和价值类型不太熟悉,所以让我先向你解释一下,然后你可以更好地理解类之间的区别/结构,所以我不是直截了当地回答你的问题,坚持下去,直到你在那里找到你的答案。

C#中有两种主要类型,第一种是Refernce Types,第二种是Value Types

C#Common Type System (CTS)有一个简单的层次结构,下图说明了CTS中值类型和引用类型之间的关系。

参考类型

每当你创建一个引用类型时,它只创建引用(C ++也有引用,但C#引用与C ++引用有所不同,请参阅 - > C++ references Vs C# references)在栈上,以及对象(如果已创建)是在堆上创建的(C#引用非常接近C ++指针)。

C#参考类型包括:

我已经提供了所有这些链接,你可以继续阅读它们。

价值类型

每当你创建一个Value Type对象时,它本身就是在堆栈上创建的,而不是堆(只在堆上创建引用类型)

MSDN Documentation of Value Types州:

  

基于值类型的变量直接包含值。将一个值类型变量分配给另一个值复制包含的值。这与引用类型变量的赋值不同,后者复制对象的引用而不是对象本身。

价值类型包括:

结构属于以下类别:

我刚刚为您提供了内容,您必须自己阅读。

所以问题的答案是:

  

struct / class是如何不同的,c ++中的c#struct是什么?

是struct是一个值类型,类是引用类型,所以创建一个类的实例只会创建一个引用(或者说指针,不要使用这个术语,因为它们不是指针,而只是在堆栈中有一些理解)并将在Managed Heap中创建实例(为了对Managed Heap有所了解,在C#中研究bool)。在创建结构的实例时,它将在堆栈中创建对象而不是托管堆。

  

在c#中创建一个带有new的类总是导致Class *?

不,是的!

从某种意义上说,类属于引用类型,并且在堆栈上创建了引用,而不是指针,所以你不能说正在创建指针到类实例,但引用是。

是的,从某种意义上讲,当您(非正式地)说出C#中的引用时,它们就像指针一样。

修改

我知道,您正试图在C#代码中使用void GetData(Entity& entity, Filter* filter, Data* data)函数(或类似函数),请参阅Automatic Memory Management,我认为您可以在那里找到答案。