Tag: struct

将带有字节数组的结构传递给interop-ed方法

我有一种情况,我必须将结构传递给C方法(在我的C#文件中声明为extern)。 然而,这个结构非常复杂。 我已经成功地使用了AllocHGlobal的方法,但我想了解是否可以通过仅传递对结构的引用来使它以这种方式工作。 [StructLayout(LayoutKind.Sequential)] struct lgLcdBitmapHeader { public Formats Format; } [StructLayout(LayoutKind.Explicit)] struct lgLcdBitmap { [FieldOffset(0)] public lgLcdBitmapHeader hdr; [FieldOffset(0)] public lgLcdBitmap160x43x1 bmp_mono; [FieldOffset(0)] public lgLcdBitmapQVGAx32 bmp_qvga32; } [StructLayout(LayoutKind.Sequential)] struct lgLcdBitmap160x43x1 : IDisposable { /// /// Format = LGLCD_BMP_FORMAT_160x43x1 /// public lgLcdBitmapHeader hdr; /// /// byte array of size LGLCD_BMP_WIDTH * LGLCD_BMP_HEIGHT, use AllocHGlobal to […]

将C / C ++ Struct转换为C#.Net CF WinCE

嗨,我试图将C / C ++ Strcut转换为C# C / C ++ Struct看起来像: typedef struct _NDISUIO_QUERY_OID { NDIS_OID Oid; PTCHAR ptcDeviceName; UCHAR Data[sizeof(ULONG)]; } NDISUIO_QUERY_OID, *PNDISUIO_QUERY_OID; 我的C#Struct是: [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct _NDISUIO_QUERY_OID { public uint Oid; [MarshalAs(UnmanagedType.LPWStr)] public string ptcDeviceName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8*sizeof(uint))] public string Data; }; 我对转换后的结构有点怀疑,有人能澄清这个转换吗? 如果可能,任何人都可以告诉我任何教程或一些有助于将数据类型或结构从c / c ++转换为C#.Net CF的引用。 谢谢 :)

什么时候结构太大了?

可能重复: C#中的结构Vs类 很抱歉,如果这是一个开放式问题,但我只是想知道我的结构是否太大了。 我想要使​​用结构的原因是因为我已经知道它们比类更快,我认为我真的需要速度。 我发现如果你的结构太大,它实际上会减慢你的程序,所以我想知道这个的指导方针以及我的结构是否需要转换为类。 public struct Tiles { public Rectangle rect; //i know this wont run with them being initalized like this but if i change to a class this will //stay like this and im in the middle of deciding what to do Bitmap currentPic = new Bitmap(50, 50); ImageAttributes imgAttr = new […]

是否可以更改基本数据类型的默认值?

我最近创建了一个通用的Matrix 类,它充当List <List >集合的包装器。 据我所知,这堂课工作得很好。 关于T的默认值,我遇到了一个小问题。 我创建了一个Matrix (3,3)的实例,它创建了一个3×3的整数矩阵,默认使用默认值(T)默认为0。 我知道值类型(包括基元)默认为0等效,引用类型默认为null。 我想知道是否可以更改此默认值,以便如果将值类型传递到Matrix,它将填充5,例如,而不是0。 我尝试创建自己的struct(值类型),但由于无法在结构体中使用无参数构造函数,我找不到从0更改默认值的方法。 我怀疑更改默认值是不可能的,并且我必须在实例化后逐个单元地循环遍历Matrix,但我想在这里询问以防万一。

编组结构,嵌入指针从C#到非托管驱动程序

我正在尝试使用P / Invoked DeviceIoControl()调用将C#(.NET Compact Framework 3.5)与Windows CE 6 R2流驱动程序连接。 对于其中一个IOCTL代码,驱动程序需要一个DeviceIoControl输入缓冲区,该缓冲区是包含嵌入指针的以下非托管结构: typedef struct { DWORD address; const void* pBuffer; DWORD size; // buffer size } IOCTL_TWL_WRITEREGS_IN; 我在C#中定义了结构: [StructLayout(LayoutKind.Sequential)] public struct IoctlWriteRegsIn { public uint Address; public byte[] Buffer; public uint Size; } 和我的P / Invoke签名为: [DllImport(“coredll.dll”, CharSet = CharSet.Unicode, SetLastError = true)] static extern bool […]

C#自动深度复制struct

我有一个结构, MyStruct ,有私人成员private bool[] boolArray; 和方法ChangeBoolValue(int index, bool Value) 。 我有一个类, MyClass ,有一个字段public MyStruct bools { get; private set; } public MyStruct bools { get; private set; } 当我从现有的MyStruct对象创建一个新的MyStruct对象,然后应用方法ChangeBoolValue()时,两个对象中的bool数组都会更改,因为引用而不是引用的引用被复制到新对象。 例如: MyStruct A = new MyStruct(); MyStruct B = A; //Copy of A made B.ChangeBoolValue(0,true); //Now A.BoolArr[0] == B.BoolArr[0] == true 有没有办法强制副本实现更深层次的副本,或者有没有办法实现这个不会有同样的问题? 我特意将MyStruct设为结构,因为它是值类型,我不希望引用传播。

将Structs与WCF服务一起使用

有没有关于使用结构作为WCF服务的返回类型的官方建议? 我目前正在与我没有写的服务进行互动,并发现自己受到启发,要求查看我的烦恼是否合理。 我过去总是使用类 – 可能部分是因为这是样本总是显示的,但正如我现在想的那样,出于其他“直观”的原因: 我通过定义一个单独的项目开始了契约风格,这个项目的接口代表了服务来回传递的类型。 我使用LINQ很多,因此对于可空性的测试是隐含的引用类型,而对于结构和其他值类型,我总是需要标记为可空。 虽然我承认它比我脑子里的项目符号列表更直观,但是有些东西会马上来找我。 我想问这个问题,因为我正在处理一个返回结构的服务,并且在处理返回值时必须写: var foo = Bar.Value.MyField; 代替 var foo = Bar.Value;

将C转换为C#

我正在尝试将此C代码转换为C#,是否有C#等效于C union typedef? struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; typedef struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un; } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR; 谢谢。

C#相当于python的struct.pack

是否有一个C#库允许与标准库中的 python struct类似的function? 可以使用实际对齐的结构非常接近地模拟结构库。 但我还没有找到任何方法来直接控制C#结构中的结尾(C#的结构似乎更倾向于COM互操作,而不是通用二进制包装)。

无法在Unity中编组从C ++到C#的结构数组

我正在尝试将C ++中的struct数组传递给C#中的Unity脚本。 当我在生产中使用代码时,数组的大小会有很大差异,所以我实际上需要传递一个未知长度的数组。 我的聪明想法是将数组存储在堆上,并将对该数组的引用传递给Unity。 我发现StackOverflow的post就是如何做到的。 但是然后Unity抱怨引用为null。 这是我的C ++代码的一部分: extern “C” struct S; // Not currently used. struct S { int i; float f; }; extern “C” bool helloWorld(S ** a, int * i); S * s; bool helloWorld(S ** a, int * i) { s = new S[4]; for (int j = 0; j < […]