Tag: 不安全

C#:将通用指针转换为数组

我想将一个byte*转换为byte* byte[] ,但我也希望有一个可重用的函数来执行此操作: public unsafe static T[] Create(T* ptr, int length) { T[] array = new T[length]; for (int i = 0; i < length; i++) array[i] = ptr[i]; return array; } 不幸的是我收到编译器错误,因为T可能是“.NET托管类型”,我们无法指向那些 。 更令人沮丧的是,没有generics类型约束可以将T限制为“非托管类型”。 是否有内置的.NET函数来执行此操作? 有任何想法吗?

Marshal.GetFunctionPointerForDelegate如何在实例成员上工作?

我想知道Marshal.GetFunctionPointerForDelegate。 即我想知道它如何将委托转换为非静态函数到函数指针。 它是否动态生成以某种方式附加实例的代码存根? 如果是这样,这不是泄密记忆吗? 也许代表在终结者中解放了它? 它看起来不像System.Delegate有一个终结器,所以我对这个机制的工作原理非常感兴趣。 我假设函数指针需要4个字节,实例需要4个字节(32位),但它返回一个简单的IntPtr。

嵌套的固定语句

根据fixed语句的C# 引用 : fixed语句阻止垃圾收集器重定位可移动变量。 … 执行语句中的代码后,将取消固定任何固定变量并进行垃圾回收。 因此,不要指向固定语句之外的那些变量。 我的问题是,如果我们为同一个变量嵌套了fixed语句,那么我在这个页面上找不到的内容是什么? var data = new byte[100]; unsafe { fixed(byte* pData = data) { //pData points to the “pinned” variable fixed(byte* pData2 = data) { //pData points to the “pinned” variable //pData2 points to the “pinned” variable } //Does pData still point to the “pinned” variable? } } 上面的代码当然只是为了说明。 […]

不安全的C#技巧提高速度

我不习惯使用指针(例如C ++)编码,也不习惯使用不安全的岛:只使用“安全”C#。 现在我想在.Net Micro Framework的C#中实现一个函数,其中紧凑性和性能非常重要。 基本上,我会收集4个短裤,从而填充缓冲区(例如字节数组)。 假设每个样本都是这样的: struct MyStruct { public short An1; public short An2; public short An3; public short An4; } 每个样本都是通过计时器事件收集的,因此我无法循环(有几个原因)。 我已经尝试了很多方法来有效地做到这一点,但表现最好的似乎是这个: unsafe struct MyStruct2 { public fixed byte Buffer[Program.BufferSize]; } unsafe class Program { public const int BufferSize = 0x1000; public const int ArraySize = BufferSize / 8; static MyStruct2 _struct2 […]

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

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

为什么*(int *)0 = 0导致访问冲突?

出于教育目的,我正在编写一组方法,这些方法会导致C#中的运行时exception,以了解所有exception是什么以及导致它们的原因。 现在,我正在修补导致AccessViolationException程序。 对我来说最明显的方法是写入受保护的内存位置,如下所示: System.Runtime.InteropServices.Marshal.WriteInt32(IntPtr.Zero, 0); 正如我所希望的那样,这AccessViolationException了一个AccessViolationException 。 我想更简洁地做到这一点,所以我决定编写一个带有不安全代码的程序,并通过为零指针赋值来做(我认为的)完全相同的事情。 unsafe { *(int*)0 = 0; } 由于无法理解的原因,这会抛出NullReferenceException 。 我玩了一些,发现使用*(int*)1而不是抛出NullReferenceException ,但如果使用负数,如*(int*)-1 ,它将抛出一个AccessViolationException 。 这里发生了什么? 为什么*(int*)0 = 0会导致NullReferenceException ,为什么它不会导致AccessViolationException ?

使用不安全代码的C#位图

我正在使用以下代码在C#中制作图像蒙版: for(int x = 0; x < width; x++) { for(int y = 0; y < height; y++) { bmp.SetPixel(x,y,Color.White); } } for(int x = left; x < width; x++) { for(int y = top; y < height; y++) { bmp.SetPixel(x,y,Color.Transparent); } } 但这太慢了……与此相比,不安全的是什么? 它会分配得更快吗? 最后我用PNG格式做了一个bmp.Save()。 更新: 按照MusiGenesis的建议阅读http://sofzh.miximages.com/c%23/Alpha 0-255 } } } bmp.UnlockBits(bmd); bmp.Save(test.png”,ImageFormat.Png); Alpha通道:0表示完全透明,255表示该像素没有透明度。 […]

C#中的固定语句

在我们的一个项目中,我们有类似的代码。 任何人都可以解释(简单英语)为什么需要修复语句? class TestClass { int iMyVariable; static void Main() { TestClass oTestClass = new TestClass(); unsafe { fixed (int* p = &oTestClasst.iMyVariable) { *p = 9; } } } }

使用不安全的代码发布Web应用程序

我正在尝试发布一个Web应用程序(使用VS2012 Web),我需要运行一个vb脚本。 该脚本目前无法正常运行,可能是因为缺少权限。 我目前正在尝试以用户身份运行它并提供一些凭据。 我必须提供的密码必须在System.Security.SecureString ,它需要创建一个char *。 当我在调试中运行我的应用程序时,一切正常并且符合预期。 但到了将应用程序发布到服务器的时候,它说: 1>C:\SVN\…\Default.aspx.cs(108,21,108,27): error CS0227: Unsafe code may only appear if compiling with /unsafe 我已经允许在项目属性中使用不安全的代码,但我不知道为什么VS在调试时会看到该属性,而不是在发布时。 当我点击发布时,我在错误列表中看到CS0227错误,但它只停留了1秒,然后它就消失了……似乎第二个足以使构建失败。 关于问题是什么的任何想法? 这是我的代码: Process proc = new Process(); ProcessStartInfo psi = new ProcessStartInfo(“C:\\Windows\\System32\\cscript.exe”, “\”” + scriptPath + “\” ” + args); psi.UseShellExecute = false; psi.RedirectStandardInput = true; psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; […]

C#中的ref和out是否与C ++中的指针相同?

我只是用C#做了一个Swap例程: static void Swap(ref int x, ref int y) { int temp = x; x = y; y = temp; } 它与C ++代码的作用相同: void swap(int *d1, int *d2) { int temp=*d1; *d1=*d2; *d2=temp; } 那些ref和out关键字如C#的指针而不使用unsafe代码?