Tag: 不安全

C#使用reflection获取不安全结构中的固定字段类型

我正在尝试使用一些固定字段来获取不安全结构的字段类型。 固定字段FieldType不返回实际类型。 [StructLayout(LayoutKind.Sequential, Pack = 1)] public unsafe struct MyStruct { public UInt32 Field1; public fixed sbyte Field2[10]; public UInt64 Field3; } void Test() { var theStruct = new MyStruct(); string output = “”; foreach (FieldInfo fi in theStruct.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance)) { output += fi.Name + “: ” + fi.FieldType.ToString() + “\r\n”; } } 输出: […]

安全与不安全的代码

今天阅读这个关于安全和不安全代码的问题我然后在MSDN中阅读它,但我仍然不理解它。 你为什么要在C#中使用指针? 这纯粹是为了速度吗?

如何使用C#获取char **?

我需要以下列forms将参数传递给不安全的DllImported函数: [DllImport(“third_party.dll”)] private static extern unsafe int start(int argc, char** argv); 我假设它是一个字符串数组。 但是,当我尝试执行以下操作时,我得到’无法从字符串[]转换为char **’错误。 我如何让这个工作? 谢谢。 string[] argv = new string[] { }; start(0, argv); 编辑1:问题被标记为重复,但看着可能重复的问题,我仍然没有看到如何使这个工作。 编辑2:进一步确定问题和所需参数。 它看起来像您的标准argc / argv参数(参数计数,然后是参数值)。 与启动ac程序的方式相同: int main(int argc, char** argv); 对于这个特殊问题,我根本不想传递任何参数(因此count为0)。 编辑3:我从第三方库供应商那里获得了更多信息。 这里是: 第一个参数是参数计数 第二个参数是一个以空字符结尾的字符串数组 字符串是ANSI编码的 编辑4 :使用工作解决方案进行最终编辑(至少在我的情况下)。 我会把它作为答案,但不能,因为这个问题被标记为重复。 这是一个帮助我最多的问题的链接 。 最后,dll函数需要一个指向ANSI字符串缓冲区的指针数组。 所以我的最终方法(基于相关问题)如下。 在内存中创建一个数组来保存指针,然后将每个字符串分配到内存中的其他位置,并在第一个指针数组中写入指向这些字符串的指针。 此代码适用于生产: [DllImport(“third_party.dll”, CallingConvention = CallingConvention.Cdecl, […]

C#中的不安全代码

在C#中,不安全代码有哪些限制? 例如,我可以像使用C或C ++一样进行几乎任意的指针转换和算术运算吗?

通用BitConverter式方法?

我最近遇到过一种情况,我需要创建一个通用方法来从字节数组中读取数据类型。 我创建了以下类: public class DataStream { public int Offset { get; set; } public byte[] Data { get; set; } public T Read() where T : struct { unsafe { int dataLen = Marshal.SizeOf( typeof( T ) ); IntPtr dataBlock = Marshal.AllocHGlobal( dataLen ); Marshal.Copy( Data, Offset, dataBlock, dataLen ); T type = *( ( […]

字节的最大长度?

我正在尝试创建一个byte数组,其长度为UInt32.MaxValue 。 这个数组本质上是一个小的(ish)内存数据库: byte[] countryCodes = new byte[UInt32.MaxValue]; 但是,在我的机器上,在运行时,我得到一个System.OverflowException其中“算术运算导致溢出”。 这是怎么回事? 我是否需要使用unsafe块和malloc ? 我如何在C#中做到这一点?

为什么这段代码没有unsafe关键字?

在回答他自己有争议的问题时 , Mash已经说明你不需要“unsafe”关键字直接读写任何.NET对象实例的字节。 您可以声明以下类型: [StructLayout(LayoutKind.Explicit)] struct MemoryAccess { [FieldOffset(0)] public object Object; [FieldOffset(0)] public TopBytes Bytes; } class TopBytes { public byte b0; public byte b1; public byte b2; public byte b3; public byte b4; public byte b5; public byte b6; public byte b7; public byte b8; public byte b9; public byte b10; public byte […]

删除C#不安全指针

我知道在C#中使用/unsafe标志,你可以使用指针。 在C / C ++中删除指针你会使用free(pointer); 并delete pointer; 分别。 但是,如何使用C#指针实现相同的效果?

在包含固定数组的托管不安全结构上,C#fixed语句的开销是多少?

我一直试图确定在C#中使用固定语句的真正成本是什么,用于包含固定数组的托管不安全结构。 请注意我不是指非托管结构。 具体来说,有没有理由避免下面的’MultipleFixed’类显示的模式? 简单地修复数据的成本是否为非零,接近零(= =成本类似于在进入/退出固定范围时设置和清除单个标志),或者它是否足够重要以尽可能避免? 显然,这些课程是为了帮助解释这个问题而设计的。 这是针对XNA游戏中的高使用率数据结构,其中此数据的读/写性能至关重要,因此如果我需要修复数组并将其传递到任何地方,我会这样做,但如果没有任何差别我我更喜欢将fixed()本地保留在方法中,以帮助保持函数签名对于不支持不安全代码的平台更加轻松。 (是的,它的一些额外的咕噜声代码,但不管它需要……) 不安全的结构ByteArray { 公共固定字节数据[1024]; } class MultipleFixed { unsafe void SetValue(ref ByteArray bytes,int index,byte value) { fixed(byte * data = bytes.Data) { data [index] = value; } } unsafe bool Validate(ref ByteArray bytes,int index,byte expectedValue) { fixed(byte * data = bytes.Data) { return data [index] == expectedValue; } […]

无法获取地址,获取大小或声明指向托管类型的指针

我已经做了一些研究,但现在我仍然坚持为什么我仍然得到这个错误。 我有一个具有以下属性的结构: struct Account { //private attributes private double mBalance; private int mAccountNumber; private string mName; private string mDateCreated; } 我正在尝试执行以下操作: class BankManager { //private attributes private unsafe Account *mAccounts; private unsafe bool *mAccountsAvailable; private int mNumberAccounts; } 即使将我的类帐户转换为结构,对类BankManager中的属性使用“unsafe”,并告诉编译器它可以使用不安全的代码(在属性 – >构建中),我仍然会收到此错误 *mAccounts 任何想法为什么? 我很确定我在结构中使用的所有类型都是合法的,可以在c#中使用指针。 提前致谢!