返回顶部
首页 > 资讯 > 精选 >C#中如何使用结构体
  • 769
分享到

C#中如何使用结构体

2023-06-18 00:06:57 769人浏览 薄情痞子
摘要

这期内容当中小编将会给大家带来有关C#中如何使用结构体,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。例如c++中定义的以下结构体:struct RCEStruct { &nb

这期内容当中小编将会给大家带来有关C#中如何使用结构体,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

例如c++中定义的以下结构体:

struct RCEStruct {    int Event;   int Flag;     char User[40];   };

C#结构体使用同时有一个公开方法:

extern "C" __declspec Word CALLBACK GetStruct(RCEStruct* pEventStruc);

我们将它编译为 MyCppDll.DLL

那么C#结构体使用上我们在C#中可以直接定义相同的结构体和引用GetStruct:

[StructLayout(LayoutKind.Sequential)]   public struct RCEStruct {   public int Event;   public int Flag;   public char[40] User;   }      [DllImport("MyCppDll.dll", CharSet=CharSet.Auto)]   public static extern int GetStruct(RCEStruct rce);

注意C#里定义的结构体应该和C++里定义的一样。这里如果是public string User就有可能出错(具体我没试过,不知道C#是否会自动将char[]转变为string,另外还要注意,在C#中为User赋值时,长度不应超过40)。

通过这种方式我们就可以向C++传递或者获得结构体。但一个限制就是必须在C#端主动调用GetStruct()

还有一种情况,与上一种相反,就是我们不是希望在C#中调用C++类库,而是想在C++类库中调用我们已经写好的C#类库。这在托管C++里是可以实现的。其中一个应用案例就是在为第三方系统写C++插件的时候,我们必须在插件端主动调用C#类库(前提是我们需要使用它,除非我们完全用C++代码来写这个插件)。

这样的话我们的C#结构体使用应该是在C#类库公开方法,例如:

public struct RCEStruct {   public int Event;   public int Flag;   public string User;   }      public void DoSomething(RCEStruct rce){   rce.Flag++;   }

假定编译成 MyCSharpDll.DLL

C#结构体使用之C++端代码如下:

#using ﹤mscorlib.dll﹥   #using ﹤CuteSuProc.dll﹥      void SomeMethod(RCEStruct* pEventStruc){   // 将C++结构体赋值到C#结构体   MyCSharpDll::RCEStruct* CSStruct;   csStruct-﹥Event = pEventStruc.Event;   csStruct-﹥Flag = pEventStruc.Flag;   // csStruct-﹥User ?? 将char转换成string,在C++里如何处理?      MyCSharpDll::DoSomething(csStruct);      // 将C#结构体赋值到C++结构体   // 因为 pEventStruc 由外界传入,被 DoSomething 方法修改后,可能仍需要外界知道   pEventStruc-﹥Event = csStruct.Event;   pEventStruc-﹥Flag = csStruct.Flag;   // pEventStruc-﹥User ?? 将string转换成char[]    }

托管C++在处理.net类库时,有些细节是很繁琐的,让人觉得有些晕乎。譬如很多地方要加__GC修饰符。还有像数组字符串的转换都比较麻烦。所以上面代码可能会有些小错误。但大致意思就是这样。很明显,这样的做法非常麻烦。对结构体进行操作前,我们进行一次赋值,操作后,又进行一次赋值。

有没有办法直接让C#操作原始的结构体呢?就像C#中操作C++一样,不需要通过一个中间人?能不能直接这样:

#using ﹤mscorlib.dll﹥   #using ﹤CuteSuProc.dll﹥      void SomeMethod(RCEStruct* pEventStruc){   MyCSharpDll::DoSomething(pEventStruc);   }

答案是否定的。我们没有办法直接将C++里的 RCEStruct转换为 C#里的 RCEStruct。

那么还剩一种方法,就是直接对内存进行操作。因为是结构体,他们肯定是保存在连续内存空间中的。

我们先来看看C#中如何操作内存,也就是非托管的数据。这需要引用System.Runtime.InteropServices命名空间。该命名空间下的Marshal的一些静态方法提供了这样的功能:

Marshal.ReadInt32()//从指定内存地址读取4位

Marshal.PtrToStringAnsi()//从指定内存地址读取字符串

Marshal.WriteInt32()//将整数写到指定内存地址

Marshal.WriteByte()//将字符串写到指定内存地址

我们来看看具体的C#结构体使用代码:

using System;   using System.Text;   using System.Runtime.InteropServices;      internal sealed class RCEvent {   public int Event;   public int Flag;   public string User;   };      internal sealed class RCEventAgent {   internal static RCEvent Read(IntPtr ptr){   RCEvent Event = new RCEvent();      Event.Event = ReadEvent(ptr);   Event.Flag = ReadFlag(ptr);   Event.User = ReadUser(ptr);      return Event;   }      internal static int ReadEvent(IntPtr basePtr) {   return Marshal.ReadInt32(basePtr);   }   internal static int ReadFlag(IntPtr basePtr) {   return Marshal.ReadInt32(basePtr,4);   }   internal static string ReadUser(IntPtr basePtr) {   return Marshal.PtrToStringAnsi(  new IntPtr(basePtr.ToInt32() + 8));   }      internal static void Write(ClientEvent Event,IntPtr ptr) {   WriteEvent(ptr,Event.Event);   WriteFlag(ptr,Event.Flag);   WriteUser(ptr,Event.User);   }      internal static void WriteEvent(IntPtr basePtr,int value) {   Marshal.WriteInt32(basePtr,value);   }   internal static void WriteFlag(IntPtr basePtr,int flag) {   Marshal.WriteInt32(basePtr,4,flag);   }   internal static void WriteUser(IntPtr basePtr,string user) {   WriteString(basePtr,user,8,40);   }   private static void WriteString(  IntPtr basePtr,string value,int offset,int length) {   int pos = 0;   byte[] bytes = Encoding.Default.GetBytes(value);   while(pos ﹤ length) {   if (pos ﹤ bytes.Length)   Marshal.WriteByte(basePtr,offset,bytes[pos]);   else   Marshal.WriteByte(basePtr,offset,0);      pos ++;   offset ++;   }   }   }

C#结构体使用代码解析:这样我们就可以通过ReadEvent和WriteEvent直接在c#中处理该结构体。或者通过 ReadXXX() 和 WriteXXX() 直接修改其字段。

public void DoSomething(IntPtr ptr){   RCEvent Event = RCEventAgent.Read(ptr);   Event.Flag ++;   RCEventAgent.Write(ptr, Event);      // 或者以下代码   // RCEventAgent.WriteFlag( ptr, RCEventAgent.ReadFlag(ptr) + 1 );   } C++中则可以直接将结构体地址传给C#:   #using   ﹤mscorlib.dll﹥   #using   ﹤CuteSuProc.dll﹥      void SomeMethod(RCEStruct* pEventStruc){   MyCSharpDll::DoSomething(pEventStruc);   }

上述就是小编为大家分享的C#中如何使用结构体了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: C#中如何使用结构体

本文链接: https://lsjlt.com/news/294766.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++中如何使用结构体
    这篇文章给大家介绍C++中如何使用结构体,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。建议大家可以和这篇文章结合着来看,C++的中的...
    99+
    2023-06-17
  • C#中如何使用结构体
    这期内容当中小编将会给大家带来有关C#中如何使用结构体,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。例如C++中定义的以下结构体:struct RCEStruct { &nb...
    99+
    2023-06-18
  • C语言中结构体如何使用
    今天就跟大家聊聊有关C语言中结构体如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、关于结构体在C语言中,结构体(struct)指的是一种数...
    99+
    2024-04-02
  • C#中如何使用结构体构造函数
    本篇文章给大家分享的是有关C#中如何使用结构体构造函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。///〈summary〉  ///启动服务端的参数结构&...
    99+
    2023-06-17
  • C语言中的结构体如何使用
    本篇内容介绍了“C语言中的结构体如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!结构体的声明结构体的定义:结构体是一些值的集合,这些值...
    99+
    2023-07-02
  • C语言中结构体和共用体如何使用
    本篇文章给大家分享的是有关C语言中结构体和共用体如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。结构体 / struct结构体的定义声明一个结构体类型的一般形式为:str...
    99+
    2023-06-16
  • C语言结构体如何使用
    本文小编为大家详细介绍“C语言结构体如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言结构体如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。本质一些值的集合。简单使用#include ...
    99+
    2023-06-30
  • c# 如何使用结构体实现共用体
    目录理解 C 语言的共用体使用 C# 实现共用体共用体作为另一个共用体的成员在 C 和 C# 编程语言中,结构体(Struct)是值类型数据结构,它使得一个单一变量可以存储多种类型的...
    99+
    2024-04-02
  • C#中如何定义结构体
    这篇文章将为大家详细讲解有关C#中如何定义结构体,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C#结构体定义的情况:C#结构体定义也可以象类一样可以单独定义.class  ...
    99+
    2023-06-18
  • c语言结构体指针如何使用
    在C语言中,我们可以使用指针来操作结构体变量。首先,我们需要定义一个结构体类型,然后声明一个结构体变量。接下来,我们可以使用指针来操...
    99+
    2023-10-28
    c语言
  • C语言结构体,枚举,联合体如何使用
    本篇内容介绍了“C语言结构体,枚举,联合体如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、匿名结构体struct{ &n...
    99+
    2023-07-02
  • C#结构体怎么使用
    本篇内容介绍了“C#结构体怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实例using System;using ...
    99+
    2023-06-17
  • Go语言中结构体如何使用
    本篇文章为大家展示了Go语言中结构体如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。结构体Go语言中的基本数据类型可以表示一些事物的基本属性,但是当我们想表达...
    99+
    2024-04-02
  • Go语言中如何使用结构体
    这篇文章将为大家详细讲解有关Go语言中如何使用结构体,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。结构体结构体是 go 语言中一个比较重要的概念,在 c  语言中也有类似的东西。由...
    99+
    2023-06-15
  • c++中结构体怎么用
    结构体是一种复合数据类型,可组合不同类型的数据。创建结构体:使用 struct 关键字,定义成员的类型和名称。访问成员:使用点运算符 (.) 访问成员变量。使用结构体指针:使用结构体指针...
    99+
    2024-05-12
    c++
  • C语言中的结构体内嵌函数如何使用
    今天小编给大家分享一下C语言中的结构体内嵌函数如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。C语言的结构体内嵌函数看...
    99+
    2023-07-05
  • C语言中如何定义结构体
    本篇内容主要讲解“C语言中如何定义结构体”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言中如何定义结构体”吧!什么是结构体?在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚...
    99+
    2023-06-16
  • C++ Struct结构体怎么使用
    今天小编给大家分享一下C++ Struct结构体怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一.C语言 ...
    99+
    2023-07-05
  • 如何在c++中使用map结构
    如何在c++中使用map结构?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。map的常用用法map 表示映射,可以将任何基本类型(包括 STL 容器)映射到任何基本类型(包括 S...
    99+
    2023-06-14
  • C语言中的结构体怎么使用
    这篇文章主要讲解了“C语言中的结构体怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言中的结构体怎么使用”吧!一、关于结构体在C语言中,结构体(struct)指的是一种数据结构,是...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作