Tag: unsafe

调试器将指针类型静态字段的值显示为零0x0,而实际上它具有有效值

我尝试使用类型uint*访问struct的静态字段的值时遇到此行为 在调试时,监视窗口将静态字段StaticBitMask的值显示为零,但实际上(并且如预期的那样)它是一个有效指针,并且Console.WriteLine()打印它,如下面的控制台输出中所示: Pointers: —————– Static bitmask pointer: 0x706790 Instance bitmask pointer: 0x708A20 Values: —————– Static bitmask pointer val: 0xFFFFFFFF Instance bitmask pointer val: 0xFFFFFFFF 固定实例字段未观察到此不一致行为。 对于那些,可以在观察窗口中看到实际值并打印出来。 为什么会这样? 我知道顺便说一句,这不是一个表明,但为什么,一个奇迹。 此外,在结构中使用指针类型的静态字段会带来什么后果? 由于它不能被标记为fixed ,它是否可能随时随地移动购买GC? 以下是源代码,您可以直接作为控制台应用程序运行以重现问题。 谢谢。 using System; using System.Runtime.InteropServices; public unsafe struct UIntBitMask { private static int uintNumberOfBits = sizeof(uint) * 0x8; public static uint* StaticBitMask; public […]

从C#调用C ++函数 – 不平衡堆栈

我有一个带有以下签名的非托管C ++函数: int function(char* param, int ret) 我试图用C#调用它: unsafe delegate int MyFunc(char* param, int ret); … int Module = LoadLibrary(“fullpathToUnamanagedDll”); IntPtr pProc = GetProcAddress(Module, “functionName”); MyFunc func = (MyFunc)System.Runtime.InteropServices.Marshal.GetDelegateForFunctionPointer(pProc, typeof(MyFunc)); unsafe { char* param = null; int ret = 0; int result = func(param, ret); } 据我所知,从旧的C ++项目规范中, param为null, ret为0都是函数的有效输入。 当我尝试调用它似乎工作,但退出时我得到以下错误: 检测到PInvokeStackImbalance 对PInvoke函数’… :: Invoke’的调用使堆栈失衡。 […]

C#项目设置“允许不安全的代码”的实际function是什么

我想知道C#项目设置“允许不安全代码”是否仅适用于项目本身的不安全C#代码,还是在链接本机C ++ DLL时是否需要设置此选项? 如何链接自身链接到本机DLL的托管DLL? 这个选项在引擎盖下真正做了什么?

Marshal.PtrToStringUni()vs new String()?

假设我有一个char *类型的指针到unicode字符串,我知道长度: char* _unmanagedStr; int _unmanagedStrLength; 我有2种方法将其转换为.NET字符串: Marshal.PtrToStringUni((IntPtr)_unmanagedStr, _unmanagedStrLength); 和 new string(_unmanagedStr, 0, _unmanagedStrLength); 在我的测试中,两个调用都给出了完全相同的结果,但new string()比Marshal.PtrToStringUni()快1.8倍。 为什么这种性能差异? 这两者之间还有其他function差异吗?

GCHandleType.Pinned与使用“fixed”关键字类似吗?

我正在尝试使用“安全”代码中的IntPtr,将其与“不安全”模式下的操作进行比较。 GCHandleType.Pinned类似于在不安全模式下使用“fixed”吗? GCHandle pinnedArray = GCHandle.Alloc(byteArray, GCHandleType.Pinned); IntPtr pointer = pinnedArray.AddrOfPinnedObject(); //do your stuff pinnedArray.Free(); VS byte[] buffer = new byte[255]; fixed (byte* p = buffer) { IntPtr ptr = (IntPtr)p; // do you stuff here }

为什么我的不安全代码阻塞比我的安全代码慢?

我正在尝试编写一些能够方便地处理video帧的代码。 我收到帧作为System.Windows.Media.Imaging.WriteableBitmap 。 出于测试目的,我只是应用一个简单的阈值滤波器来处理BGRA格式图像,并根据BGR像素的平均值将每个像素分配为黑色或白色。 这是我的“安全”版本: public static void ApplyFilter(WriteableBitmap Bitmap, byte Threshold) { // Let’s just make this work for this format if (Bitmap.Format != PixelFormats.Bgr24 && Bitmap.Format != PixelFormats.Bgr32) { return; } // Calculate the number of bytes per pixel (should be 4 for this format). var bytesPerPixel = (Bitmap.Format.BitsPerPixel + 7) / 8; […]

固定大小的结构类型数组

如何在C#中声明结构类型的固定大小数组: [StructLayout(LayoutKind.Sequential,Pack=1), Serializable] public unsafe struct MyStruct{ … } public class MyClass { … public fixed MyStruct myStruct[256]; } 这将导致CS1663:不允许使用结构类型的固定大小缓冲区,我该如何解决这个问题?我不喜欢使用C#或“托管集合数据结构”类型,因为我需要经常将其编译为本机C ++

如何测试AccessViolationException的处理

我需要编写一个测试来validation我的代码可以处理AccessViolationException(或任何其他WIN32损坏状态exception – CSE),它通常通过调用第三方库来处理不安全的上下文。 这应该都是使用C#on .net 4.0完成的。 我发现了这个相关的问题如何处理AccessViolationException和这篇相关的文章http://dotnetslackers.com/articles/net/All-about-Corrupted-State-Exceptions-in-NET4.aspx ,它解释了如何捕获这些CSE和他们的背景。 所以我想在测试中激发一个WIN32 CSE,以确保在我的应用程序中正确处理。 就像是: 一些要测试的示例类: public class MyExceptionHandler { [HandleProcessCorruptedStateExceptions] public void HandleCorruptedStateException() { try { //Force genuine unsafe AccessViolationException //not just a throw new AccessViolationException } catch(Exception e) { //Log/cleanup/other } } public void DoesNotHandleCorruptedStateException() { try { //Force genuine unsafe AccessViolationException //not just a throw new […]

在C#中将指针转换为循环选项

我如何将其转换为循环而不使用指针。 byte[] InputBuffer = new byte[8]; unsafe { fixed (byte* pInputBuffer = InputBuffer) { ((long*)pInputBuffer)[0] = value; } } 我正在尝试使用此页面中的代码: 查询字符串参数混淆

.NET C#unsafe / fixed不会固定直通数组元素吗?

我有一些并发故障的并发代码,我把问题减少到两个似乎相同的情况,但是一个失败而另一个没有。 我现在花了太多时间试图创建一个失败的最小的完整示例,但没有成功,所以我只是发布失败的行,以防任何人看到明显的问题。 Object lock = new Object(); struct MyValueType { readonly public int i1, i2; }; class Node { public MyValueType x; public int y; public Node z; }; volatile Node[] m_rg = new Node[300]; unsafe void Foo() { Node[] temp; while (true) { temp = m_rg; /* … */ Monitor.Enter(lock); if (temp == m_rg) […]