Tag: 指针

不安全的C#和2D渲染指针,好还是坏?

我正在编写一个包装DirectX 9的C#控件,并提供简化的界面来执行2D像素级绘图。 .NET要求我将此代码包装在不安全的代码块中,并使用allow unsafe code选项进行编译。 我锁定整个表面,然后返回指向锁定的内存区域的指针。 然后,我可以使用“简单”指针算法直接写入像素数据。 我对此进行了性能测试,发现与我所知的其他“安全”方法相比,速度有了很大提高。 这是在C#.NET应用程序中操纵单个像素的最快方法吗? 有更好,更安全的方式吗? 如果有一个同样快速的方法不需要指针操作,那么我会优先使用它。 (我知道这是2008年,我们都应该使用DirectX 3D, OpenGL等,但是这个控件专门用于2D像素渲染,并且不需要3D渲染。)

获取指向字节数组的指针的不安全方法

这种行为在C#中是否有效 public class MyClass { private byte[] data; public MyClass() { this.data = new byte[1024]; } public unsafe byte* getData() { byte* result = null; fixed (byte* dataPtr = data) { result = dataPtr; } return result; } }

如何获取托管类的原始内存指针?

如何在C#中找到指向托管类的原始指针,希望它是内存中的原始大小? 显然,CLR不允许这样做 – 更确切地说,严格禁止,因为管理类的非托管表示永远不应该出于稳定性和安全性原因而被处理 – 所以我正在寻找一个黑客。 我不是在寻找序列化 – 我确实需要托管类的转储,因为它在原始内存中表示。 更准确地说,我在下面的例子中寻找类似函数getObjectPtr东西: IntPtr getObjectPtr(Object managedClass) {…} void main() { var test=new TestClass(); IntPtr* ptr_to_test=getObjectPtr(test); Console.WriteLine(ptr_to_test.ToString()); } 提前致谢! 编辑:我终于找到了自己的解决方案,并且当回来发布它作为答案时,对于已经发布的答案很快就完全感到惊讶…感谢大家! 这非常快,完全出乎意料。 最接近我的解决方案是@thehennyy的一个,但是我没有发布它,因为@Chino提出了更好的一个(抱歉我一开始就把它弄错了,我只是忘了再次取消引用指针)。 它不需要代码不安全,而且要求GC更容忍: class Program { // Here is the function in case anyone needs it. // Note, though, it does not preserve the handle while you work with […]

List 是指针吗?

我注意到List的行为与其他简单对象不同,例如String 。 这个问题看似新手,但这真让我感到震惊,因为我认为List是简单的对象。 以下面的代码为例: List ls1 = new List(); ls1.Add(“a”); List ls2 = ls1; ls1.Add(“b”); 最后, ls1将等于{“a”, “b”} , ls2也是如此。 这与此代码的行为完全不同: String s1 = “a”; String s2 = s1; s1 = “b”; 其中s1的末尾等于b , s2等于a 。 这意味着List实际上是指针对吗?

如何在C#中显示指针地址?

自从我用C#编程以来,我没有做过任何指示 – 而且很久以前我的C ++时代。 我认为我应该更新我的知识,因为这里有另一个问题,他们正在玩弄它们。 我理解他们都没关系,但我无法弄清楚如何将指针的地址写入控制台…… char c = ‘c’; char d = ‘d’; char e = ‘e’; unsafe { char* cp = &d; //How do I write the pointer address to the console? *cp = ‘f’; cp = &e; //How do I write the pointer address to the console? *cp = ‘g’; cp = […]

MemorySharp设置偏移到不起作用的地址

好的,我正在使用MemorySharp库来读取/写入游戏的内存。 我的问题是当我尝试将偏移量添加到基指针地址时Visual Studio在运行时抛出错误。 这是基本代码 using (var m = new MemorySharp(ApplicationFinder.FromProcessName(“Cube”).First())) { IntPtr healthPtr = GetBaseAddress(“Cube”) + 0x0036B1C8; int[] offsets = {0x39c, 0x16c}; foreach(var offset in offsets) { healthPtr = m[healthPtr + offset].Read(); //I’m getting the error on this line } var healthLocation = m[m[healthPtr].Read()]; float health = healthLocation.Read(); MessageBox.Show(health.ToString()); } 这是我的GetBaseAddress方法 internal static IntPtr GetBaseAddress(string […]

如何在C#中实现C ++样式函数指针,而不使用委托

我正在学习C#中的指针,并且好奇如果可以在C#中使用C ++样式函数指针。 是的,我知道C#有自己的等效function指针概念(称为委托)。 但我只是想知道使用C#中的指针是否可以实现相同,而不使用委托。 如果在C#中使用指针完全合法(使用不安全选项)并且指针语义几乎与C / C ++类似,那么在我看来,也应该能够使用C / C ++样式函数指针。 请指导我这个。 可能吗? 如果是的话怎么样?如果不是那么为什么? 请注意C#和C / C ++中指针使用的相似性,如下例所示 /* Using pointers in C# (Very similar to C/C++) */ using System; namespace UnsafeCodeApplication { class TestPointer { public unsafe static void Main() { int[] list = {10, 100, 200}; fixed(int *ptr = list) /* let us […]

创建一个只指向另一个数组的一部分的数组?

我有一个包含引用类型元素的巨大数组,我想创建许多其他数组,这些数组基本上只指向那个大数组的特定部分。 换句话说,我想创建“索引器”或“长度指针”。 在C ++中,使用指针很容易,并为每个指针分配一个长度,例如创建一个包含长度指针的结构。 我怎样才能在C#/ .NET中实现这一目标? 重点是避免复制任何东西,我只想指向已经存在于内存中的数组中的特定部分。 有任何想法吗?

在C#中用另一个替换对象实例

在这个问题中,我想知道是否以及如何做到这一点。 这种技术似乎是非常糟糕的做法,但似乎我正在使用的API(UnityEditor)正在做这样的事情,我只是很好奇。 如果对同一对象有多个引用,是否可以将新对象实例化到同一个内存槽中,以便所有先前的引用都指向新对象? 我发现唯一可行的方法是使用非托管C ++。 基本上发生以下情况: // Original prefab GameObject prefab = x; prefab.tag = “Untagged”; // A copy of the original prefab GameObject prefabCopy = PrefabUtility.InstantiatePrefab(prefab) as GameObject; prefabCopy.tag = “EditorOnly”; // Change from initial value “Untagged” Debug.Log(prefab.tag); // “Untagged” – expected Debug.Log(prefabCopy.tag); // “EditorOnly” – expected // Replace contents of prefab file with […]

C#:将指针类型用作字段?

在C#中,可以声明一个具有指针类型成员的结构(或类),如下所示: unsafe struct Node { public Node* NextNode; } 它是否安全(错误……暂时忽略了具有讽刺性的小unsafe旗帜……)使用这种结构? 我的意思是在堆上长期存储。 根据我的理解,GC可以随意移动,当它更新对已被移动的内容的引用时,它是否也会更新指针? 我猜不是,这会使这种结构非常不安全,对吧? 我确信这样做有更好的选择,但称之为病态的好奇心。 编辑:似乎有些混乱。 我知道这不是一个伟大的结构,我纯粹想知道这是否是一个安全的结构,即:指针保证指向你最初指向的任何东西? 原始的C代码用于遍历树(深度优先)而不进行递归,其中树存储在数组中。 然后通过递增指针遍历数组,除非满足某个条件,然后将指针设置为NextNode,其中遍历继续。 当然,在C#中也可以通过以下方式实现: struct Node { public int NextNode; … // other fields } 其中int是下一个节点的数组中的索引。 但出于性能原因,我最终会摆弄指针和fixed数组以避免边界检查,原始的C代码似乎更自然。