Tag: 指针

如何将C#List中创建的对象的地址传递给C ++ DLL?

我一直在谷歌寻找我的问题的一些答案,但不太明白我发现了什么。 在使用System.IO读取一些文本文件后,我有一些在C#List中创建和存储的对象。 之后,我想将每个对象的引用(使用const指针)发送到C ++ dll中的内部类,以便它可以使用它们来计算某些算法。 以下是我正在做的一些简单示例(不是实际代码): C#类: [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public class SimpleClass { [MarshalAs(UnmanagedType.LPStr)] public string Name; public float Length; } 与相应的C结构: struct SimpleClass { const char* Name; float Length; }; 存储在 List ItemList; 解析一些文本文件后。 然后调用以下dll函数: C#: [DllImport(“SimpleDLL”)] public static extern void AddSimpleReference(SimpleClass inSimple); C: void AddSimpleReference(const SimpleClass* inSimple) { g_Vector.push_back(inSimple); // g_Vector […]

C#列表是否像C ++列表一样?

我只是想知道C#List是否像C ++ List一样。 在C ++中删除大列表中间的元素很快,因为我知道元素只是指向下一个元素。 因此,在大型C#列表中删除元素时,是否与C ++中的相同? 或者C#列表更像是带有索引的C ++向量,因为您可以获得C#列表中元素的索引号。

从堆列中获取数组而不分配堆

我有一个列表,我想将其数组分配给一个属性。 public void BuildMesh(List list){ mesh.vertices=list.ToArray(); } 现在的问题: 该项目是游戏,并且在垃圾收集方面非常困难,因此ToArray()的默认实现不是一个选项,因为它在列表的内部数组旁边创建了一个新数组。 网格对象来自闭源API,顶点属性是Vector3 [],因此无法为其指定指针。 我有任何阻止堆分配的选项吗? 编辑:这不是重复 不能使用IList 。 网格来自一个封闭的源API,需要Vector3 [],所以我不能为它分配IList 。

使用ref参数委派

有没有办法在下面的代码中保持相同的function,但无需创建委托? 我正在与包含许多各种DeleteSomethingX(ref IntPtr ptr)方法的第三方API接口,我正在尝试集中IntPtr.Zero检查的代码。 private void delegate CleanupDelegate(ref IntPtr ptr); … private void Cleanup(ref IntPtr ptr, CleanupDelegate cleanup) { if (ptr != IntPtr.Zero) { cleanup(ref ptr); } }

使用指针和偏移量查找地址C#

我做了很多关于记忆阅读的研究,我到了这里。 我得到了指针和偏移值,通过手动添加地址并在Cheat Engine上选择“Pointer”我可以得到地址。 但我的问题是如何在C#上做到这一点? 指针: “client.dll”+ 0065F38 偏移: E4 这两个值返回Cheat Engine中的地址,我想知道如何在C#中创建它。

C#中的指针?

在一个C#维护项目中,我遇到了以下变量声明: Int32* iProgressAddress; 它是C#中的指针声明吗? 我认为C#中没有指针概念,这句话是什么意思?

如何在F#中创建一个值类型的Union类型?

普通F#区分联合是引用类型。 如何在F#中创建一个简单的 (非递归的,只有值类型的字段)联合类型,它是一个值类型? 根据一些互联网搜索,我当前(非工作)的尝试看起来如下: [] type Float = [] [] val mutable Val1 : float [] [] val mutable Int1 : int new (a:float) = {Val1 = a} 以下博客文章显示通过C#显示可能的内容 我知道上面的内容不是F#的习惯用法,但我试图优化我的部分应用程序的性能,并且分析清楚地表明堆分配(JIT_new)的成本是导致我的性能瓶颈的原因。一个简单的联合类型是满足我需求的完美数据结构,而不是堆分配的。

为什么’stackalloc’关键字不适用于属性?

我最近在C#中编写了一些不安全的代码,并注意到这会产生语法错误: public unsafe class UnsafeByteStream { public UnsafeByteStream(int capacity) { this.Buffer = stackalloc byte[capacity]; } public byte* Buffer { get; } } 结果是: “Invalid expression term ‘stackalloc’ / ; expected / } expected” 。 但是,当我首先将其分配给本地字段时,如下所示: public UnsafeByteStream(int capacity) { byte* buffer = stackalloc byte[capacity]; this.Buffer = buffer; } 然后没有产生语法错误。 这有什么原因,或者编译器是什么? 我理解指针类型属性并不常见,但我仍然不明白为什么这是语法错误而不是语义错误,假设代码有问题。

PInvoke – Marshal一个来自指针的结构数组

我试图在这个问题上回答这个问题 我的结构在C中看起来像这样 typedef struct drive_info_t { unsigned char drive_alias[32]; } drive_info_t; 我的function在C中看起来像这样 unsigned int get_drive_info_list(drive_info_t **list, unsigned int *item_count) { //fill list in native C //print out in native C printf(“list.alias – %s\r\n”,list[i]->drive_alias); } 我的C#struct看起来像这样 [StructLayout(LayoutKind.Sequential)] public struct drive_info_t { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public byte[] drive_alias; } 我的C#函数声明如下所示 [DllImport(“mydll.dll”, EntryPoint = “get_drive_info_list”, CallingConvention = […]

C#指针与C ++指针

我一直在学习编程,我选择C ++和C#编程作为第一语言。 更具体地说,我有一本旧的C书,有人让我借用,我用它来学习C#。 我使用Visual Studio Express并使用C ++和C#编写。 我感兴趣的一个领域是直接内存管理的能力。 我正在努力学习如何使用它来优化我的代码。 但是,我正在努力做到这一点,实际上看到任何真正的性能提升。 例如,以下是C#中的以下代码: unsafe static void Main(string[] args) { int size = 300000; char[] numbers = new char[size]; for (int i = 0; i < size; i++) { numbers[i] = '7'; } DateTime start = DateTime.Now; fixed (char* c = &numbers[0]) { for (int i = 0; […]