前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >VisualStudio can not get the correct struct object value in Locals windows

VisualStudio can not get the correct struct object value in Locals windows

作者头像
林德熙
发布于 2021-06-29 06:50:15
发布于 2021-06-29 06:50:15
26200
代码可运行
举报
文章被收录于专栏:林德熙的博客林德熙的博客
运行总次数:0
代码可运行

VisualStudio 的局部变量窗口里面看到某些结构体的值和实际上的结构体调用 ToString 方法返回的值是不同的 When I use the unsafe struct with the special size and I override the ToString method, then I can find the actual ToString value and the value in VisualStudio Locals windows are different

尝试如下代码

Try to run this code:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    class Program
    {
        static void Main(string[] args)
        {
            var str = "Hello";

            GC.TryStartNoGCRegion(1000000);
            unsafe
            {
                fixed (char* sp = str)
                {
                    var a = new ByValStringStructForSizeMAX_PATH();
                    Buffer.MemoryCopy(sp, &a, 260 * 2, 5 * 2);
              
                    Console.WriteLine(a);
                }
            }
        }
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Size = 260 * sizeof(char))]
    public unsafe struct ByValStringStructForSizeMAX_PATH
    {
        char _firstChar;
        //char _foo;

        /// <inheritdoc/>
        public override string ToString()
        {
            fixed (char* charPtr = &_firstChar)
            {
                //var t = charPtr;
                //StringBuilder str = new StringBuilder();
                //int i = 0;
                //while (true)
                //{
                //    char c = *t;
                //    t++;

                //    if (c == 0)
                //    {
                //        break;
                //    }

                //    i++;

                //    str.Append(c);
                //}

                //str.Append(" ").Append(i).Append(";").Append(GetHashCode()).Append(";").Append(_firstChar.GetHashCode());

                //fixed (void* p = &this)
                //{
                //    str.Append(";").Append(((IntPtr) (&p)));
                //}

                //return str.ToString();

                return new string(charPtr);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="val"></param>
        public static implicit operator string(ByValStringStructForSizeMAX_PATH val) => val.ToString();
    }

以上代码放在 GitHub 上: https://github.com/lindexi/lindexi_gd/tree/52c6016997220b13641c21e470f3aec9069a87a6/GewelhalllemniGafihaja

You can find the code in github: https://github.com/lindexi/lindexi_gd/tree/52c6016997220b13641c21e470f3aec9069a87a6/GewelhalllemniGafihaja

此时可以看到在 VisualStudio 的局部变量窗口里面,显示的 a 变量的值是 H 然而实际上调用 ToString 在控制台将会输出 Hello 字符串

And you can find the value in VisualStudio Locals windows is H but the actual value is Hello

这个看起来是 VisualStudio 的锅,在调试的时候,使用的是拷贝的结构体的值,但是在拷贝时,丢失了结构体的 Size 属性

Seem that the VisualStudio use the copy object and miss the size

如果给 ByValStringStructForSizeMAX_PATH 再加一个字段,将如上代码的 _foo 字段去掉注释,如下面代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Size = 260 * sizeof(char))]
    public unsafe struct ByValStringStructForSizeMAX_PATH
    {
        char _firstChar;
        char _foo;

        // 忽略代码
    }

那么此时的 VS 调试可以看到是 He 两个字符

本文只是用来给 VisualStudio 报 Bug 的,请看 https://developercommunity.visualstudio.com/t/VisualStudio-can-not-get-the-correct-str/1450433

特别感谢 lsj 的协助


本文会经常更新,请阅读原文: https://blog.lindexi.com/post/VisualStudio-can-not-get-the-correct-struct-object-value-in-Locals-windows.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者前往 CSDN 关注我的主页

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

无盈利,不卖课,做纯粹的技术博客

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C#学习笔记——CopyMemory
Socket接收到的byte []要转换成自定义的struct / 自定义Struct转换成byte []都相当麻烦 用循环去转换太浪费时间了……于是想到用CopyMemory,Google一圈终于搞定 下面的代码是在Snippet Compiler里编译通过的
vv彭
2021/08/06
9600
看我是如何用C#编写一个小于8KB的贪吃蛇游戏的
译者注:这是Michal Strehovský大佬的一篇文章,他目前在微软.NET Runtime团队工作,主要是负责.NET NativeAOT功能的开发。我在前几天看到这篇文章,非常喜欢,虽然它的内容稍微有点过时(还是使用的.NET Core 3.0),不过其中的一些编程技巧和思维方式很受用,特意找到Michal大佬要到了授权,翻译给大家看。
InCerry
2023/03/08
6880
看我是如何用C#编写一个小于8KB的贪吃蛇游戏的
dotnet C# 将 Byte 二进制数组使用不安全代码快速转换为 int 或结构体数组
我在写一个有趣的 WPF 应用,我会不断收到从硬件发过来的数据,这些数据被使用 Byte[] 数组进行传输。我想要使用最快的方法转换为我的 int 数组或者转换为结构体数组,此时可以使用不安全代码的方式转换
林德熙
2021/02/01
1.7K0
C++/CLI(二)Mono C++/CLI Native调用和P/Invoke调用
本文根据Mono C++原文档翻译,这篇文章的目的,就是想说CLR程序在VS下面生成的DLL不能给Unity调用,因为Mono的Native调用的编码和MS CLR的不一样,如果Unity想要去调用C++程序,需要使用P/Invoke的方式,这两者的不兼容使得本来非常方便的C++/CLI在Unity下毫无用武之地,希望有一天MS能够给Mono CLR一片土地,方便你我他,还有就是高高兴兴写了半个月MS CLR以为能在Unity下使用了,结果一Run就炸,所以说以后代码未动,单元测试一定要先写啊,这片区代码需要全部重构了,血与泪的教训。
Pulsar-V
2019/04/01
3.8K0
WPF 获取是哪个进程占用了文件
例如有文件是 file 字符串表示的文件,通过在下文定义的 FileUtil 的 WhoIsLocking 方法可以获取占用此文件的进程,如下面代码
林德熙
2022/08/12
6330
扫描仪对接(C#)
源代码地址:http://www.codeproject.com/Articles/171666/Twain-for-WPF-Applications-Look-Ma-No-Handles
码客说
2022/09/19
4.8K0
扫描仪对接(C#)
.NET性能优化-使用结构体替代类
我们知道在C#和Java明显的一个区别就是C#可以自定义值类型,也就是今天的主角struct,我们有了更加方便的class为什么微软还加入了struct呢?这其实就是今天要谈到的一个优化性能的Tips使用结构体替代类。 那么使用结构体替代类有什么好处呢?在什么样的场景需要使用结构体来替代类呢?今天的文章为大家一一解答。注意:本文全部都以x64位平台为例
InCerry
2022/11/14
5120
我为什么放弃Go语言?
👉腾小云导读 你在什么时候会产生“想要放弃用 Go 语言”的念头?也许是在用 Go 开发过程中,接连不断踩坑的时候。本文作者提炼和总结《100 Go Mistakes and How to Avoid Them》里的精华内容,并结合自身的工作经验,盘点了 Go 的常见典型错误,撰写了这篇超全避坑指南。让我们跟随文章,一起重拾用 Go 的信心~ 👉目录 1 注意 shadow 变量 2 慎用 init 函数 3 embed types 优缺点 4 Functional Options Pattern 传递参数
腾讯云开发者
2023/06/06
1.7K0
我为什么放弃Go语言?
免杀工具Sharperner浅析
Sharperner是一款C#编写的自动化免杀工具,用来生成免杀的exe文件或者C++的loader,在antiscan.me上为全绿,效果可见一斑。
鸿鹄实验室
2021/07/06
1.1K0
免杀工具Sharperner浅析
dotnet 获取指定进程的输入命令行
我找到两个方法,一个需要引用 C++ 库支持 x86 和 x64 程序,另一个都是C#代码,但是只支持 x64 程序
林德熙
2019/03/13
1.2K0
【NEW】WPF MVVM 模式下自写自用的窗口样式
SVG是一种图形文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基于XML(Extensible Markup Language),由World Wide Web Consortium(W3C)联盟进行开发的。严格来说应该是一种开放标准的矢量图形语言,可让你设计激动人心的、高分辨率的Web图形页面。用户可以直接用代码来描绘图像,可以用任何文字处理工具打开SVG图像,通过改变部分代码来使图像具有交互功能,并可以随时插入到HTML中通过浏览器来观看。
Shunnet
2022/09/01
2.4K0
【NEW】WPF MVVM 模式下自写自用的窗口样式
.NET 零开销抽象指南-hez2010
2008 年前后的 Midori 项目试图构建一个以 .NET 为用户态基础的操作系统,在这个项目中有很多让 CLR 以及 C# 的类型系统向着适合系统编程的方向改进的探索,虽然项目最终没有面世,但是积累了很多的成果。近些年由于 .NET 团队在高性能和零开销设施上的需要,从 2017 年开始,这些成果逐渐被加入 CLR 和 C# 中,从而能够让 .NET 团队将原先大量的 C++ 基础库函数用 C# 重写,不仅能减少互操作的开销,还允许 JIT 进行 inline 等优化。
InCerry
2022/11/14
6780
利用ActiveX实现web页面设置本地默认打印机、纸张大小
通常web技术无法设置本地计算机的默认打印机,包括用代码设置纸张大小,如果业务系统中真遇到这种需求,只能通过其它辅助手段(比如ActiveX)实现。下面这段代码,出自网上被广泛使用的"泥人张打印API"(抱歉未找到原始出处),已经用C#封装了很多关于底层打印的API方法
菩提树下的杨过
2018/09/20
2.1K1
dotnet C# 在 Linux 系统设置或获取音量以及变更音量收到通知
本文记录使用 PulseAudio 在 Linux 系统上进行设置和获取当前音量,以及是否静音。当系统音量发生变更时,收到事件通知
林德熙
2024/04/25
2320
APK安装流程详解5——Installer、InstallerConnection和Installd守护进程
因为Installer继承自SystemService,所以我们看下Installer的onStart方法 代码在Installer.java 396行
隔壁老李头
2018/08/30
2.4K0
APK安装流程详解5——Installer、InstallerConnection和Installd守护进程
C#进阶——记一次USB HID的各种坑(x86,x64,win10,win7)
写工控上位机的搬砖人,难免会遇到USB通讯,在一个项目中,我写的上位机使用USB HID协议和STM32通讯传输数据,从零大概花了几天找例程,找资料,最后是各种搬砖修补,终于出来了一个出版DOME,能和下位机实时通讯了。
vv彭
2022/05/10
2.8K2
Windows网络模型之Select模型以一个聊天室服务端为例
因为服务端的在listen之前以及listen的内容几乎一样故省略,感兴趣的可以去看
晨星成焰
2024/07/23
3301
Windows网络模型之Select模型以一个聊天室服务端为例
网络基础「HTTP」
在上一篇文章中,我们了解了 协议 的制定与使用流程,不过太过于简陋了,真正的 协议 会复杂得多,也强大得多,比如在网络中使用最为广泛的 HTTP/HTTPS 超文本传输协议
北 海
2024/05/25
1650
网络基础「HTTP」
Electron中调用DLL
NodeJS地址:https://nodejs.org/en/download/ Electron版本: https://electronjs.org/releases/stable
码客说
2019/10/21
11.7K0
C/C++ 递归遍历文件并计算MD5
首先,需要引用 md5 的相关代码,参考这篇文章,防止链接内容被删除,这里再记录一次: md5.h
王瑞MVP
2022/12/28
1K0
相关推荐
C#学习笔记——CopyMemory
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验