Tag: 不安全

我似乎可以让msbuild构建不安全的代码块

msbuild似乎不允许我构建unsafe块,即使我的.csproj指定: … true 我的构建命令是: msbuild myProject.sln /p:Configuration=Release /p:Platform=”Any CPU” /t:Clean,Build

C#不安全代码固定指针作为参数传递

我在msdn上遇到了以下代码: unsafe static void SquarePtrParam (int* p) { *p *= *p; } unsafe static void Main() { Point pt = new Point(); pt.x = 5; pt.y = 6; // Pin pt in place: fixed (int* p = &pt.x) { SquarePtrParam (p); } // pt now unpinned. Console.WriteLine (“{0} {1}”, pt.x, pt.y); } 我只是想知道,我们是直接访问SquarePtrParam函数中的指针,它是否inheritance了从调用方法修复数组的信息? 为什么我们不需要在SquarePtrParam中将其显式设置为本地SquarePtrParam 。 […]

不安全的代码对安全代码有影响吗?

据我所知,将方法标记为不安全将禁用对该代码的一些CLR检查,但除了DLL / EXE无法运行之外,这对系统的其他部分是否安全有任何影响。不受信任的环境。 特别是, 它们是否是对完整dll无效的任何安全检查,因为它被标记为不安全? 如果DLL被标记为不安全,但标记为不安全的方法实际上没有被调用,这是否与DLL标记为安全相同? 将不安全的代码保存在单独的DLL中是否有任何运行时的好处? 我有重写64位窗口上的嵌套控件的问题,如此处详述和解决方案(看起来工作的那个)涉及不安全的代码,我想了解添加此代码对我的项目的影响。

这里是否需要GC.KeepAlive,或者我可以依赖本地和参数来保持对象存活吗?

我有一堆方法使用不安全的代码直接使用WPF的WriteableBitmap并从其BackBuffer读取。 每当我做这样的事情时,我是否应该使用GC.KeepAlive并不完全清楚: int MyMethod(WriteableBitmap bmp) { return DoUnsafeWork(bmp.BackBuffer); } 一方面,在MyMethod的堆栈上仍然存在对bmp的引用。 另一方面,它似乎依赖于实现细节 – 这可以编译为尾调用,例如,在输入DoUnsafeWork不保留对bmp的引用。 同样,想象下面的假设代码: int MyMethod() { WriteableBitmap bmp1 = getABitmap(); var ptr = bmp.BackBuffer; WriteableBitmap bmp2 = getABitmap(); return DoUnsafeWork(ptr, bmp2); } 理论上,在方法返回之前,对bmp1的引用仍保留在堆栈中,但同样,它似乎使用了实现细节。 当然编译器可以自由地合并bmp1和bmp2因为它们永远不会同时存在,即使编译器从来没有这样做,JITter仍然可以,并且可能确实如此(例如,通过将它们存储在同一个寄存器中,一个,然后另一个)。 所以,一般来说:我应该依赖locals / arguments作为对象的有效引用,还是应该总是使用GC.KeepAlive来保证正确性? 这尤其令人费解,因为显然, FxCop认为GC.KeepAlive总是很糟糕 。

P /从C到C#调用,不知道数组的大小

正确地知道我的代码我已经将结构声明为这样,修复了这个16,在编译时知道。 struct CONSOLE_SCREEN_BUFFER_INFOEX { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public int ColorTable[]; } 但我需要的是能够拥有这种结构: struct CONSOLE_SCREEN_BUFFER_INFOEX { int arraySize; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0)] public int ColorTable[]; } 从C函数响应中获取arraySize,初始化具有适当大小的ColorTable数组,将响应结果放入ColorTable。 不确定是否可能,现在就进行调查,并且非常欢迎任何评论。

为什么’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; } 然后没有产生语法错误。 这有什么原因,或者编译器是什么? 我理解指针类型属性并不常见,但我仍然不明白为什么这是语法错误而不是语义错误,假设代码有问题。

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

这种行为在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; } }

不安全的代码来改变String对象的长度(通过变异!)?

由于.NET不使用C样式的null来结束字符串,我如何保留分配的字符串,但是使用不安全的代码来改变它的长度? 据我所知,.NET为每个字符串使用一个20字节的标头,大概这是存储字符串长度的地方,无论如何直接修改这个长度? 因此,.NET会将字符串保留在内存中,但是当我调用.Length它将返回我想要的.Length 。 如果这是可能的话,那么听到这种疯狂可能的副作用也会很有趣 UPDATE 我正在努力完成这个而不使用reflection。

我应该将我的安全代码与不安全的代码混合在一起吗?

我正在开发一个使用一堆WIN32 API调用的项目,需要一些不安全的代码。 从最佳实践角度来看,我应该在使用/ unsafe开关编译的DLL中隔离此代码,同时保持主应用程序的安全吗? 换一种方式。 有没有理由不使用/ unsafe开关编译项目? 有潜在的风险吗?

如何在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 = […]