当在一个结构内创建一个数组时,该结构是直接包含数组的值还是该数组的内存引用?
我正在创建一个如下: public struct Smb_Parameters { public byte WordCount; public ushort[] Words; } 当我分配下面的值时: Smb_Parameters smbParameter = new Smb_Parameters(); smbParameter.WordCount = 0; string words= "NT LM 0.12"; smbParameter.Words = Encoding.ASCII.GetBytes(name); 在上面的作业中smbParameter.WordCount包含值0,但smbParameter.Words是否直接包含值(字节的Arry)或内存引用包含值的位置? 编辑1 : 我想将数据包发送到服务器.为此,我需要使用以下代码将Smb_Parameters对象转换为
10 2024-04-26
编程技术问答社区
如何在C#中为数组结构分配内存
结构1: typedef struct _wfs_cdm_cu_info { USHORT usTellerID; USHORT usCount; LPWFSCDMCASHUNIT * lppList; } WFSCDMCUINFO, * LPWFSCDMCUINFO; 结构2: typedef struct _wfs_cdm_cashunit { USHORT usNumber; USHORT usType; LPSTR lpszCashUnitName; CHAR cUnitID[5]; CHAR cCurrencyID[3]; ULONG ulValues; ULONG ulInitialCount; ULONG ulCount; ULONG ulRejectCount; ULONG ulMinimum; ULONG ulMaximum; BOO
16 2024-04-26
编程技术问答社区
调用C#结构
我正在尝试序列化以下C#结构: [Serializable] [StructLayout(LayoutKind.Sequential, Size = 70, CharSet = CharSet.Ansi)] public struct USSDContinueModel { [MarshalAs(UnmanagedType.U4)] public uint Command_Length; [MarshalAs(UnmanagedType.U4)] public uint Command_ID; [MarshalAs(UnmanagedType.U4)] public uint Command_Status; [MarshalAs(UnmanagedType.U4)] public uint Sender_ID; [MarshalAs(UnmanagedType.U4)] public uint
14 2024-04-25
编程技术问答社区
对单行字符串进行结构赋值
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public class Comarea { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1)] public string status; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)] public string operationName; } public static void StringToObject(string buffer, out Comarea comarea) { IntPtr pBuf = Marshal.StringToBSTR(buffer); comarea = (Comarea)Marshal.PtrToStructure(pBuf, typeof(Comarea))
8 2024-04-25
编程技术问答社区
将嵌套的结构归并到C#中
我们有COM服务器(作为DLL,我们只有DLL文件),可以实现两个COM接口.其中一个接口使我们能够从某些设备获取消息(作为结构).根据消息,我们需要处理相应的结构.每个结构都是指向结构变体的指针.此结构是字节数组类型(vt_array | vt_ui1). 所有结构都包含结构Header和其他一些信息.结构Header包含字段MsgId.根据MsgId,我们需要处理其他结构. 为了获得从DLL到C#的结构.我们使用反射. 现在是时候了: // Header (sub-struct of main struct) - [StructLayout(LayoutKind.Sequential)] public struct Header { public int MsgId; } // main struct [StructLayout(LayoutKind.Sequential)] public struct Main { [MarshalAs
14 2024-04-23
编程技术问答社区
在使用PInvoke时,包含bool和uint的结构有什么区别?
好吧,我现在很困惑. 在我最后一个问题之后 Console.WriteLine("sizeof bool = {0}", Marshal.SizeOf(typeof(bool))); Console.WriteLine("sizeof uint = {0}", Marshal.SizeOf(typeof(uint))); 当然要打印: sizeof bool = 4 sizeof uint = 4 也就是说,我然后崩溃了,无论如何都会尝试一下他们的建议...将结构内的单个布尔更改为UINT.我一生无法找到的是为什么这使它起作用... 所以这有效: [StructLayout(LayoutKind.Sequential)] public struct KEY_EVENT_RECORD { public bool bKeyDown; public short wRepeatCount; public short wVirtu
14 2024-04-23
编程技术问答社区
如何在c#窗体程序中的列表框中显示结构的内容
dunno如果我要正确解决这个问题?以下结构的内容在其他地方定义.当我运行代码时,它只是输出4个零的列表.任何帮助将不胜感激..... public class NativeMethods { public struct FT_DEVICE_LIST_INFO_NODE { public uint ID; public uint LocId; public string SerialNumber; public string Description; } [DllImportAttribute(@"C:\Users\Brendan\Documents\libMPSSE.dll", EntryPoint = "SPI_GetNumChannels")] public static extern uint SPI_GetChannelInfo(
14 2024-04-23
编程技术问答社区
如何将结构从合同 A 转移到合同 B?最佳实践
我找到了这样的方式,当创建一个带有结构的一般接口,然后收缩A和B与结构继承. 但是我想知道还有其他方法吗? 可以在某些情况下更新结构的合同吗? pragma experimental ABIEncoderV2; pragma solidity ^0.6.0; interface params { struct structTest { uint256 data; } } contract contractA is params{ function testCall(structTest calldata _structParams) public pure returns (uint256){ return _structParams.data; } } contract contractB is params{ contractA aContractInstance;
12 2024-04-23
编程技术问答社区
SML: 使用 abstype 和使用签名来隐藏结构的实现有什么区别?
过去,我已经在SML做了一些工作,但是现在我开始进入更有趣的部分. 使用abstype...with...end构造,我可以制作东西,但隐藏了他们的实现细节.我还可以创建我要制作的东西的签名,并使用:>操作员制作一个结构,以遵守该签名,以使实现细节隐藏. 签名/结构不是更通用的弃用版本吗?我该如何处理签名/结构无法做的弃用?我为什么要使用示例? 事先感谢您的帮助! 作为一个例子: signature SET = sig type set val empty: set val insert: int * set -> set val member: int * set -> bool end structure Set :> SET = struct type set = int list val empty = [] fun insert(x, s) = x::s fun member(x,
14 2024-04-22
编程技术问答社区
在C和C#之间传递包含数组的结构(DLL和P调用)。
我有一些复杂结构的C DLL,我确实是C#中的新手: typedef struct { int a; int b; } simple_struct; typedef struct { int d; int e; simple_struct f[20]; short g; simple_struct h[20]; short i; } complex_struct; 问题是我无法与此结构连接我的C#! 在dll中有一个函数getData(complex_struct* mystruct),然后我从c#调用它,所以我创建了: [StructLayout(LayoutKind.Sequential, Pack = 1)] unsafe struct simple_struct { public int a; public int b; } ;
16 2024-04-21
编程技术问答社区
C#多线程应用结构?
所以,如果可以访问(实时),我将为检查链接进行检查. 我的问题是如何使线程"总是忙".我的意思是说: 该应用程序运行100个线程(例如,使用循环创建)具有100个不同的URL.因此,当1个线程完成时,它的作业(检查是否可用)以获取新的URL并立即重新启动.因此,100个线程将不停地工作,直到检查所有URL. 我该如何完成? 解决方案 您要寻找的是 Parallel.foreach.foreach 为您做大部分工作. 使用100个线程也很可能不会是最佳线程数,只需让任务并行库为您管理线程计数. 这是一个示例,如果列表将被预先填充,并且在线程运行时没有更多的项目. //Parallel.Foreach will block until it is done so you may want to run this function on a background worker. public void StartThreads() { List
8 2024-04-20
编程技术问答社区
C#,从二进制文件中读取结构
我想阅读二进制的结构. 在C ++中,我会这样做: stream.read((char*)&someStruct, sizeof(someStruct)); c#中有类似的方法吗?二进制阅读器仅适用于内置类型.在.NET 4中有一个内存示意图ViewAccessor.它提供了像Read之类的方法,它似乎是我想要的,除了我必须手动跟踪我要阅读的文件中的位置. 有更好的方法吗? 解决方案 可以在C#中执行类似的操作,但是您必须将很多属性应用于结构,以便您准确地控制其在内存中的布置.默认情况下,JIT编译器控制着结构成员在内存中的布置方式,这通常意味着考虑速度和内存使用情况,将其重新排列并填充最有效的布局. 最简单的方法通常是使用二进制阅读器在文件中读取结构的单独成员,然后将值放在类中的属性中,即手动将数据验证为类实例. . 通常,它正在读取此操作中的瓶颈文件,因此阅读单独成员的小开销不会明显影响性能. 其他解决方案 public static c
8 2024-04-19
编程技术问答社区
在Windows窗体应用程序中永远循环使用
我正在使用Visual C#Sand,我使用的是Windows表单而不是控制台应用程序.因此,我不是在main()中工作,而是在表单文件中工作.我也是C#的新手,很抱歉,如果我的一些问题很愚蠢. 我基本上需要做的是当我的程序启动时,我需要它才能永远循环.由于没有主(),所以我在哪里放置此代码?我是否将其放在其中包含InitializeComponent()的函数中?程序启动后,我需要循环立即启动.但是,我有一些变量,需要在循环之前先声明.因此,基本上我需要声明变量,然后需要启动无限循环.变量是全局的. 其次,当用户按下按钮时,我需要无限循环才能断开.我该怎么做?我当时在思考: while (buttonIsPressed == false) { //do whatever I need to do } 但是,我意识到该按钮的功能永远不会被调用,因为我被困在该循环中.如果由于在无限的循环中,我从未达到按钮功能,则无法从按钮函数设置变量.有任何想法吗?我在考虑线程
14 2024-04-16
编程技术问答社区
马歇尔的结构阵列
我花了很多时间来寻找解决方案,但仍然找不到. 我有两个类: [StructLayout(LayoutKind.Sequential)] public class Result { public int Number; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)] public string Name; public int Size; } [StructLayout(LayoutKind.Sequential)] public class CoverObject { public int NumOfResults; [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 4)] public Result[] Results; } 我期望命令M
8 2024-04-14
编程技术问答社区
构造函数中的方法,不好吗?
我有一个Windows表单,并且我有一个类,可以检查文本文件以确保其具有某些方面.现在我有一个构造函数中的方法,这似乎有些怪异.我应该只是将构造函数留空,并实现start()类型方法并调用它?到目前为止,我的代码看起来像这样 public class Seating { private int segments = 0; public Seating() { checkInvoice(); getSegmentCount(); } } 解决方案 我有构造函数中的方法,似乎有些怪异 好吧,为什么还存在构造函数?在构造函数中使用方法,甚至可能失败的方法(从而打断对象创建)是完全合法的.很难说这在您的特殊情况下是否合适. 通常很好. 其他解决方案 在构造函数中调用非虚拟方法没有错.当您的构造函数发射时,您的父对象已经完全构造.但是,您要不是想要调用任何虚拟方法,因为它们可能被
12 2024-04-14
编程技术问答社区
C# P/Invoke。含有函数指针的结构的集结
对不起,随后的详细介绍.我需要一个比我更了解内部的人的见解. 这是我如何编写包含从C到C#的功能指针的结构.我想知道它是最干净和/或最有效的方法. 我正在与C中编码的本机DLL接口,该c提供了以下输入点: void* getInterface(int id); 您必须通过getInterface(int)以下枚举值之一: enum INTERFACES { FOO, BAR }; 将指针返回到包含函数指针的结构,例如: typedef struct IFOO { void (*method1)(void* self, int a, float b); void (*method2)(void* self, int a, float b, int c); } IFoo; 这是您在C中使用它的方式: IFoo* interface = (IFoo*)getInterface(FOO); interface->method1(ob
10 2024-04-12
编程技术问答社区
通用结构的尺寸
我需要找出一个通用结构的大小(我不能做大小(t)或使用元帅. 所以我写道: public static class HelperMethods { static HelperMethods() { SizeOfType = createSizeOfFunc(); } public static int SizeOf() { return SizeOfType(typeof(T)); } public static readonly Func SizeOfType = null; private static Func createSizeOfFunc() { var dm = new DynamicMethod("SizeOfType", typeof(int), new Type[] { typeof(T
12 2024-04-12
编程技术问答社区
将一个字节数组转换为一个托管结构
更新:这个问题的答案帮助我编码开源项目 alicanc的现代战争2工具github .您可以看到我如何在 extensions.cs . 我正在捕获使命召唤:现代战争2 使用 pcap.net 在我的C#应用​​中.我从图书馆收到byte[].我试图像字符串一样对其进行解析,但是效果不佳. byte[]我有一个通用数据包标头,然后是针对数据包类型的另一个标题,然后在大厅中提供有关每个玩家的信息. 一个有益的人为我检查了一些数据包,并提出了这些结构: // Fields are big endian unless specified otherwise. struct packet_header { uint16_t magic; uint16_t packet_size; uint32_t unknown1; uint32_t unknown2; uint32_t unknown3; uint32_t unknown
14 2024-04-11
编程技术问答社区
不正确的对齐或被非对象字段重叠的错误
我正在尝试创建以下结构: [StructLayout(LayoutKind.Explicit, Size=14)] public struct Message { [FieldOffset(0)] public ushort X; [FieldOffset(2)] [MarshalAs(UnmanagedType.ByValArray, SizeConst=5)] private ushort[] Y; [FieldOffset(12)] public ushort Z; } 我会收到以下错误: 无法从汇编加载'消息',因为它在偏移4处包含一个对象字段,该对象字段与非对象字段不正确对齐或重叠. 有人知道为什么这会导致错误? 注意:我无法使用包装,因为我正在使用紧凑型框架. 谢谢. 解决方案 CF元帅在这种类型的
12 2024-04-11
编程技术问答社区