Marshal.PtrToStructure 和 String 的问题

     2023-02-18     181

关键词:

【中文标题】Marshal.PtrToStructure 和 String 的问题【英文标题】:Problems with Marshal.PtrToStructure and String 【发布时间】:2011-06-14 14:07:37 【问题描述】:

我有以下课程

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public class xy11Dataset : SZLDataset

    public short Index  get; set; 

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
    private string _mlfB;
    public string MlfB
    
        get  return _mlfB; 
        set  _mlfB = value; 
    

    public UInt16 BGTyp  get; set; 

    public UInt16 Ausbg1  get; set; 

    public UInt16 Ausbg2  get; set; 

我用以下代码填充它:

byte[] objBuffer = new byte[retVal.Size];
Array.Copy(buffer, (n*retVal.Size) + 8, objBuffer, 0, retVal.Size);
GCHandle handle = GCHandle.Alloc(objBuffer, GCHandleType.Pinned);
datsets.Add((xy11Dataset)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(xy11Dataset)));
handle.Free();

我在位置 2 的 objBuffer 中有值(应该是字符串的开头),但字符串保持为空!

【问题讨论】:

【参考方案1】:

您需要在这里放弃使用自动属性。它们生成一个与属性连续的私有支持字段,它被添加到末尾。您可以使用 ildasm.exe 查看它们,它们的名称类似于 <Index>k_Backingfield。你需要让这个表达式返回正确的值:

        int offs = (int)Marshal.OffsetOf(typeof(xy11Dataset), "_mlfB");

我看不到 SZLDataSet 包含的内容,但没有它,它现在返回 0。不正确,你想要 2。最好的办法是声明一个带有公共字段的结构,其布局与缓冲区中的数据完全匹配。从值初始化类对象。

【讨论】:

不是在声明属性的地方生成自动属性支持字段吗?无论如何,建议避免使用自动属性;提供对字段顺序的更多控制。 与属性连续”,我尽可能地明确了。

ptrtostructure错误提示:此结构不得为值类,解决办法

当使用Marshal.PtrToStructure方法时发生错误,提示:此结构不得为值类此时如果代码没问题,需要将Structure(结构)重新定义为Class(类)可解决。记录于此,以免遗忘。2022.5.29 查看详情

求一个异步处理消息的方法

...辅助线程的消息处理方法里的MyStructmyStruct=(MyStruct)Marshal.PtrToStructure(m.LParam,typeof(MyStruct));即根据消息的LParam指针读取数据缓冲区的数据。缓冲区的数据是主窗口通过商业数据接收软件接收到,接收方式是该软件给启动它的窗口发... 查看详情

1.(ajaxStart 和 ajaxSend)和 2.(ajaxStop 和 ajaxComplete)有啥区别?

】1.(ajaxStart和ajaxSend)和2.(ajaxStop和ajaxComplete)有啥区别?【英文标题】:What\'sthedifferencebetween:1.(ajaxStartandajaxSend)and2.(ajaxStopandajaxComplete)?1.(ajaxStart和ajaxSend)和2.(ajaxStop和ajaxComplete)有什么区别?【发布时间】:2011-04-1317:56 查看详情

比较和交换与测试和设置

】比较和交换与测试和设置【英文标题】:compareandswapvstestandset【发布时间】:2011-04-0905:30:21【问题描述】:有人可以向我解释一下上述操作在多线程中的工作原理和区别吗?【问题讨论】:【参考方案1】:测试和设置对位进行... 查看详情

java基础8---面向对象代码块和继承和this和super和重写和重载和final

...Java中,使用括起来的代码被称为代码块。根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块。局部代码块在方法中出现;限定变量生命周期,及早释放,提高... 查看详情

setabout和setout和setaside和setback和setoff和setup区别,

参考技术Asetabout/setout都有着手干某事的意思setaboutdoingsth/setouttodosth/setoutonsth都是开始做某事的意思.另外,setoutforaplace/setoutforaplace都有动身到某地的意思,setsthout或setoutsth有陈述,阐明,安排,陈列的意思.setaside意思是留出时间、钱;... 查看详情

CRC和校验和有啥区别?

】CRC和校验和有啥区别?【英文标题】:WhatthedifferencebetweenCRCandchecksum?CRC和校验和有什么区别?【发布时间】:2011-03-2209:16:18【问题描述】:CRC和校验和有什么区别?【问题讨论】:【参考方案1】:CRC(CyclicRedundancyCheck)是checksum... 查看详情

Spring Security 'Roles' 和 'Privileges' 和 Thymeleaf 'hasRole' 和 'hasAuthority'

】SpringSecurity\\\'Roles\\\'和\\\'Privileges\\\'和Thymeleaf\\\'hasRole\\\'和\\\'hasAuthority\\\'【英文标题】:SpringSecurity\'Roles\'and\'Privileges\'andThymeleaf\'hasRole\'and\'hasAuthority\'SpringSecurity\'Roles\'和\'Privileges\' 查看详情

求1-50的偶数和,和奇数和

publicstaticvoidmain(Stringargs[]){intdoubleNumber=0;int singleNumber=0;inti=1; while(i<=50){if(i%2==0){doubleNumber+=i;}else{singNumber+=i; }i++;}System.out.println(doubeNumber);Sys 查看详情

计算1-100所有的数字和,偶数和,奇数和,被7整除的数字和

intsum=0; intouShu=0; intjiShu=0; intn=0; for(inti=1;i<=100;i++){   sum+=i;   if(i%2==0){     ouShu+=i;   }   if(i%2!=0){     jiShu+=i;   }   if(i%7==0){     n+=i;   } } 查看详情

Viewsets `create()` 和 `update()` 和 Serializers `create()` 和 `update()` 有啥区别?

】Viewsets`create()`和`update()`和Serializers`create()`和`update()`有啥区别?【英文标题】:What\'sthedifferencebetweenaViewsets`create()`and`update()`andaSerializers`create()`and`update()`?Viewsets`create()`和`update()`和Serializers`creat 查看详情

inspring和goout和falloff和afterlu

参考技术Ainspring和goout和falloff和afterlu的意思分别为:春上、走出。熄灭。结束。下降,散开,分开。午饭后。午餐后。饭后。午餐後。午饭之后。inspring和inthespring的区别,两者都可以,只是用法不同。按照语法,季节,星期,... 查看详情

使用距离和纬度和经度计算位置

】使用距离和纬度和经度计算位置【英文标题】:Calculatingalocationusingdistanceandlatitudeandlongitude【发布时间】:2021-05-1003:56:05【问题描述】:我有五个纬度和经度以及它们与某个位置的距离。问题是,有什么方法可以使用这些信息... 查看详情

自动装箱和==和equals

一,"=="和equals首先我们明确一下"=="和equals方法的作用。==如果是基本数据类型,则直接对值进行比较基本类型和包装类比较,进行自动拆箱操作如果是引用数据类型,则是对他们的地址进行比较但是只能比较相同类型的对象,... 查看详情

进程和线程之间共享和更新列表

】进程和线程之间共享和更新列表【英文标题】:SharingandUpdatingListbetweenProcessesandThreads【发布时间】:2022-01-1614:48:36【问题描述】:尝试在主进程-主线程和子进程-子线程之间共享和更新列表。目前看来,主进程和主线程共享一... 查看详情

get和post请求及进程和线程及cookie和session的区别

1)get和post请求的区别2)进程和线程的区别3)cookie和session的区别 查看详情

信源编码信源译码和信道编码和译码和加密和解密数字调制和解调和同步

                    信源编码: (1)减少码元数据和降低码元速率   (2) A/D     查看详情

学习和使用svn和github——开篇

  本文是学习和使用SVN和GitHub之开篇,主要讲的有四点内容:  一,介绍基层程序员对SVN功能的认识和使用程度  二,阐述我要学习和使用SVN和GitHub的原因  三,简要描述SVN和GitHub在使用上的区别和简... 查看详情