Net 如何获取私有属性

 

  .Net的私有属性、成员变量、方法,都可以通过反射获取调用,当然正常我们不会这么操作

  此章只是做一个反射科普,像EFCore从数据库取值的底层框架就是通过反射直接操作私有的成员变量,而不是方法。

  

  直接上例子,先定义一个类

public class TenantModel
    {
        public int Id { get; init; }//属性,未定义成员变量会自动生成
        public string Name { get; set; }//属性
        private string password;//成员变量
        public string Password//属性
        {
            private get //方法(属性里的get;set;均为方法,或者自己定义一个方法测试)
            {
                return password;
            }
            set
            {
                if (value.Length < 6)
                    throw new Exception("密码需要大于6位");
                password = value;
            }
        }
    }

  然后利用反射,获取到私有的password信息

  1)通过对象进行反射

            var te = new TenantModel()
            {
                Id = 1,
                Name = "kxy",
                Password = "1234567"
            };
            Type type = te.GetType();
            //te.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance);//获取所有私有方法
            MethodInfo func1 = type.GetMethod("get_Password", BindingFlags.NonPublic | BindingFlags.Instance);//获取私有方法
            var str = func1.Invoke(te, null).ToString();//执行方法
            FieldInfo field = type.GetField("password", BindingFlags.NonPublic | BindingFlags.Instance);//获取私有成员变量
            string pwd = field.GetValue(te)?.ToString();//取值
            field.SetValue(te, "123");//赋值,直接操作成员变量,可以跳过验证

  这样就简单实现了一个反射读取私有信息的案例,当然还可以通过程序集反射

  2)通过程序集进行反射(因为实例化)

  反射也是通过构造函数实例化的,默认为无参,也可以带参,为了展示,我们多定义一个带参构造函数

        public TenantModel(int id,string name,string password)
        {
            Id = id;
            Name = name;
            Password = password;
        }

  然后,反射代码如下:

            Assembly assembly = Assembly.Load("ServerSignalR");//反射入口,从程序集加载,ServerSignalR为程序集名称
            Type type = assembly.GetType("ServerSignalR.Models.TenantModel");//基于类的完整名称找出类型
            TenantModel te = Activator.CreateInstance(type, new object[] { 1, "kxy", "1234567" }) as TenantModel;//实例化
            MethodInfo func1 = type.GetMethod("get_Password", BindingFlags.NonPublic | BindingFlags.Instance);//获取私有方法
            var str = func1.Invoke(te, null)?.ToString();//执行方法
            FieldInfo field = type.GetField("password", BindingFlags.NonPublic | BindingFlags.Instance);//获取私有成员变量
            string pwd = field.GetValue(te)?.ToString();//取值
            field.SetValue(te, "123");//赋值,直接操作成员变量,可以跳过验证

  也可以选定dll文件

            Assembly assembly = null;
            //注意区分开发和生产环境
            if (_env.IsDevelopment())
            {
                assembly = Assembly.LoadFrom("bin//Debug//net5.0//ServerSignalR.dll");//dll的路径
            }
            else
            {
                assembly = Assembly.LoadFrom("ServerSignalR.dll");//dll的路径
            }
            Type type = assembly.GetType("ServerSignalR.Models.TenantModel");//基于类的完整名称找出类型
            TenantModel te = Activator.CreateInstance(type, new object[] { 1, "kxy", "1234567" }) as TenantModel;//实例化
            MethodInfo func1 = type.GetMethod("get_Password", BindingFlags.NonPublic | BindingFlags.Instance);//获取私有方法
            var str = func1.Invoke(te, null)?.ToString();//执行方法
            FieldInfo field = type.GetField("password", BindingFlags.NonPublic | BindingFlags.Instance);//获取私有成员变量
            string pwd = field.GetValue(te)?.ToString();//取值
            field.SetValue(te, "123");//赋值,直接操作成员变量,可以跳过验证

 

  至此,完毕!!!

  感谢关注

 

本文转载于网络 如有侵权请联系删除

相关文章

  • 详解 & 0xff 的作用

    大家好,又见面了,我是你们的朋友全栈君。首先我们要都知道,&表示按位与,只有两个位同时为1,才能得到1,0x代表16进制数,0xff表示的数二进制11111111占一个字节.和其进行&操作的数,最低8位,不会发生变化.下面着重来说说&0xff都有哪些应用:1.只是为了取得低八位通常配合移位操作符>>使用例如:javasocket通信中基于长度的成帧方法中,如果发送的信息长度小于65535字节,长度信息的字节定义为两个字节长度。这时候将两个字节长的长度信息,以Big-Endian的方式写到内存中out.write((message.length>>8)&0xff);//取高八位写入地址 out.write(message.length&0xff);//取低八位写入高地址中复制例如,有个数字0x1234,如果只想将低8位写入到内存中0x1234&0xff 0x1234表示为二进制00010010001101000xff表示为二进制11111111两个数做与操作,显然将0xff补充到16位,就是高位补0此时0xff为00

  • NSGA2算法详解「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。目录预备知识多目标优化问题的解NSGA-II简介快速非支配排序拥挤度精英策略部分代码展示1.预备知识 多目标优化的相关知识:https://blog.csdn.net/haha0332/article/details/88634378支配:假设小明9岁,50斤,小红8岁,45斤,小明无论是岁数还是体重都比小红大,所以小明支配小红。互不支配:假设小明7岁,50斤,小红8岁,45斤,小明岁数比小红小,但体重比小红大,所以小明和小红互不支配。帕累托集:在这个集合中,任意两个解互不支配。非支配排序:将一组解分成n个集合:rank1,rank2…rankn,每个集合中所有的解都互不支配,但ranki中的任意解支配rankj中的任意解(i<j).2.多目标优化问题的解 在单目标优化问题中,通常最优解只有一个,而且能用比较简单和常用的数学方法求出其最优解。而在多目标优化问题中,各个目标之间相互制约,可能使得一个目标性能的改善往往是以损失其他目标性能为代价,不可能存在一个使所有目标性能都达到最优的解(这就意味着这两个目标可能存在较大的负相关性),所以对于多

  • FL Studio水果20如何免费升级最新中文版

    FLStudio是一款功能强大的编曲软件,它也能够剪辑、混音、录音,它的矢量界面,能更好用在4K、5K甚至8K显示器上。完全重新设计混音器、动态缩放、具有6种布局风格、外加3个用户自定义面板管理音轨、多推子选择和调整、混音器的音轨群组、多点触摸支持、每个音轨10个效果插槽。它的兼容性强,可以在不同的设备中灵活应用。当然,它也没有音乐类型限制,能支持制作各种音乐类型,让你的音乐突破想象力的限制。功能介绍:FLStudio是一款功能强大的编曲软件,它也能够剪辑、混音、录音,它的矢量界面,能更好用在4K、5K甚至8K显示器上。完全重新设计混音器、动态缩放、具有6种布局风格、外加3个用户自定义面板管理音轨、多推子选择和调整、混音器的音轨群组、多点触摸支持、每个音轨10个效果插槽。它的兼容性强,可以在不同的设备中灵活应用。当然,它也没有音乐类型限制,能支持制作各种音乐类型,让你的音乐突破想象力的限制。FLStudio-win中文版下载:https://wm.makeding.com/iclk/?zoneid=41401FLStudio-mac中文版下载:https://wm.makeding.c

  • Python3.6、3.7、3.8、3.9新特性

    本文列举了Python3.6、3.7、3.8、3.9四个版本的新特性,学习它们有助于提高对Python的了解,跟上最新的潮流。一.Python3.6新特性1.新的格式化字符串方式新的格式化字符串方式,即在普通字符串前添加f或F前缀,其效果类似于str.format()。比如name="red"print(f"Hesaidhisnameis{name}.")#'Hesaidhisnameisred.'复制相当于:print("Hesaidhisnameis{name}.".format(**locals()))复制此外,此特性还支持嵌套字段,比如:importdecimalwidth=10precision=4value=decimal.Decimal("12.34567")print(f"result:{value:{width}.{precision}}")#'result:12.35'复制2.变量声明语法可以像下面一样声明一个变量并指定类型:f

  • .Net Core with 微服务 - Ocelot 网关

    上一次我们通过一张架构图(.NetCorewith微服务-架构图)来讲述了微服务的结构,分层等内容。从现在开始我们开始慢慢搭建一个最简单的微服务架构。这次我们先用几个简单的webapi项目以及ocelot网关项目来演示下网关是如何配置,如何工作的。Ocelot网关Ocelot是使用asp.netcore开发的一个api网关项目。它功能丰富,集成了路由、限流、缓存、聚合等功能。它使用.net编写,本质上就是一堆asp.netcore的中间件,所以它天生对.net友好。这些中间件拦截外部的请求,根据路由配置转发到对应的内部服务上,再把内部的返回结果对外暴露。搭建项目结构 新建一个解决方案,新建几个项目。api_gatewayAPI网关hotel_base酒店基本信息服务member_center会员中心服务ordering订单服务安装Ocelot在API网关项目上使用nuget安装Ocelot的类库。Ocelot本质上就是一堆asp.netCore的middleware。所以我们需要在UseOcelot扩展方法在注册这些中间件。Install-PackageOcelot复制publicst

  • 设计模式 ☞ 结构型模式之适配器模式

    1.1简介1.1.1概述  适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。   在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。例如,讲中文的人同讲英文的人对话时需要一个翻译,用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访问照相机的SD内存卡时需要一个读卡器等。在软件设计中也可能出现:需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式能很好地解决这些问题。1.1.2优缺点优点:  ①客户端通过适配器可以透明地调用目标接口。  ②复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。  ③将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。  ④在很多业务场景中符合开闭原则。缺点:  ①

  • Java并发编程:AQS的自旋锁

    互斥锁在AQS的互斥锁与共享锁中已经做了详细介绍,一个锁一次只能由一个线程持有,其它线程则无法获得,除非已持有锁的线程释放了该锁。这里为什么提互斥锁呢?其实互斥锁和自旋锁都是实现同步的方案,最终实现的效果都是相同的,但它们对未获得锁的线程的处理方式却是不同的。对于互斥锁,当某个线程占有锁后,另外一个线程将进入阻塞状态。与互斥锁类似,自旋锁保证了公共数据在任意时刻最多只能由一条线程获取使用,不同的是在获取锁失败后自旋锁会采取自旋的处理方式。01自旋锁自旋锁是一种非阻塞锁,它的核心机制就在自旋两个字,即用自旋操作来替代阻塞操作。某一线程尝试获取某个锁时,如果该锁已经被另一个线程占用的话,则此线程将不断循环检查该锁是否被释放,而不是让此线程挂起或睡眠。一旦另外一个线程释放该锁后,此线程便能获得该锁。自旋是一种忙等待状态,过程中会一直消耗CPU的时间片。02为什么自旋互斥锁有一个很大的缺点,即获取锁失败后线程会进入睡眠或阻塞状态,这个过程会涉及到用户态到内核态的调度,上下文切换的开销比较大。假如某个锁的锁定时间很短,此时如果锁获取失败则让它睡眠或阻塞的话则有点得不偿失,因为这种开销可能比自旋的

  • 全栈开发系列之springboot结合小程序实现小程序点餐系统

    1,有任何关于编程的问题都可以加我微信2501902696(备注编程开发)2,编程小石头,码农一枚,非著名全栈开发人员。 3,分享自己的一些经验,学习心得,希望后来人少走弯路,少填坑点餐系统须知以下开发技术后台技术选型JDK8MySQLSpring-bootSpring-data-jpaLombokFreemarkerBootstrapWebsocket小程序端技术选型微信小程序老规矩先看效果图一管理后台1菜品管理2订单管理3小程序下单完成后会有消息推送,如下4可以直接操作订单二小程序端1功能如图所示2如上图,目前实现了如下功能扫码点餐菜品分类显示模拟支付评论系统三使用流程1找老师索要源码,或者到老师微信公号回复“点餐小程序”获取源码老师微信:2501902696扫码关注公众号四JAVA代码2导入java代码1,我的java开发工具是IntelliJIDEA,最好和我保持一致2,如果你不知道如何导入java源码到idea,可以看下下面视频教程。 https://edu.csdn.net/course/play/23443/2655973创建数据表格导入源码成功后,执行下图的sql语句,

  • libstdc++库版本较低的解决办法

    小编最近使用一个程序xxx.exe时,出现了如下报错: xxx.exe:/lib64/libstdc++.so.6:version`GLIBCXX_3.4.20'notfound(requiredbyxxx.exe)在此把解决方法做个备忘。1.查看libstdc++.so.6库的信息看了一下/lib64目录下的libstdc++.so.6,是一个软链接,链接到同目录下的libstdc++.so.6.0.19: lrwxrwxrwx.1rootroot19Jan12000/lib64/libstdc++.so.6->libstdc++.so.6.0.19复制使用如下命令,可以查看支持的GLIBCXX的版本:strings/lib64/libstdc++.so.6|grepGLIBC复制结果如下: GLIBCXX_3.4 GLIBCXX_3.4.1 GLIBCXX_3.4.2 GLIBCXX_3.4.3 GLIBCXX_3.4.4 GLIBCXX_3.4.5 GLIBCXX_3.4.6 GLIBCXX_3.4.7 GLIBCXX_3.4.8 GLIBCXX_3.4.9 GL

  • 初学Mybatis 终极新手入门

    初学Mybatis终极新手入门后面会慢慢更新1.什么是框架它是软件(项目开发中的一套解决方案,不同的框架解决的是不同的问题使用框架的好处:​框架封装了很多细节,试开发者可以使用极简的方式实现功能。提高开发效率。2.三层架构表现层:​是用于展示数据​业务层:​是处理业务需求​持久层:​是和数据库交互的3.持久层技术解决方案JDBC技术:​Connection​PreparedStatement​ResultSetSpring的JdbcTemplate:​Spring中对jdbc的简单封装Apache的DBUtils:​它和Spring的JdbcTemplate很像,也是对Jdbc的简单封装 /*JDBC(JavaDataBaseConnectivity,java数据库连接) 是一种用于执行SQL语句的JavaAPI*/复制**以上都不是框架**JDBC是规范Spring的JdbcTemplate和Apache的DBUtils都是工具类4.什么是Mybatis激动人心的时候到了!!!!Mybatis概述mybatis是一个持久层框架,用Java编写的。它封装看jdbc操作的很多细节,使开发

  • Windows Server服务器开启/禁用Ping的设置方法

    网站/服务器禁Ping可以适当减轻服务器被攻击的概率,那么如何禁Ping,禁Ping后如何解除呢?下面分享两个方法:方法一:命令行模式进入服务器后点击开始——运行(快捷键:Win+R)输入命令: netsh firewall set icmpsetting 8复制这样就可以在外部Ping到服务器了,非常简单实用!同样道理,如果想禁止Ping,那运行如下命令: netsh firewall set icmpsetting 8 disable复制方法二:防火墙高级面板方式 1.进入控制面板—>管理工具—>找到“高级安全Windows防火墙” 2.点击入站规则,找到回显请求-ICMPv4-In(EchoRequest–ICMPv4-In)3.右键该规则点击“启用规则(Enable)” 禁止Ping的方法相同。声明:本文由w3h5原创,转载请注明出处:《WindowsServer服务器开启/禁用Ping的设置方法》https://www.w3h5.com/post/348.html

  • 闲话高性能计算

    第三个千年开始之际,人类醒来,伸展手脚……来瞧瞧今天有什么重要的事吧 ---《未来简史》我们总需要时常回顾过去,不只是为了怀念,更多是为了找寻通往未来的一点线索。如果运气再好一些,说不定能发现一些点(leng)子(fan)可以被翻出来再引人注目。例如AI的发展,就经历了若干次热潮,最近的一波我们还身在其中。与此相比,高性能计算似乎一直很热,又一直离我们很远。说高性能计算一直很热,是因为从天河超级计算机开始,中国就加入了超级计算机的全球军备竞赛,年年争夺超算世界冠军;说离我们远,是因为我们在日常的工作生活中见识超级计算机的机会并不多。事实上,高性能计算(HPC)离我们近在咫尺:路上开的车,发动机、底盘、车架,从内到外的设计都离不开HPC;生病吃的药,研发过程是从计算模拟开始的;无数的电影特效,是在HPC上制作的……有意思的是,在过去的一年,高性能计算又频繁被提及,变成了一个热门话题。不一样的高性能计算 如今被频繁提及的高性能计算和传统的HPC已经大不相同了。包括AI、生命科学、计算化学家等技术的突飞猛进无疑凸显了对计算力的强烈需求,从而推动了HPC的发展和变化。在前不久结束的HPCChi

  • 键盘敲击识别技术真的靠谱吗?

    所有人都知道密码是靠不住的。于是现在有一个有意思的行为生物识别是“你是如何打字的”,或称为输入行为生物识别技术。生物识别正在广泛推广大多数网络用户在选择密码时都十分大意:在不同地方使用相同的密码或者总是设置易破解的弱密码。如果对于这样的错误视而不见,那么他们的电脑总能感染可以监控你键盘敲击以及盗取登录凭证的间谍软件。能够更加充分地证明登录者就是本人,显然会大大提升很多网站(尤其是网上银行)的“幸福指数”。一些在线服务解决这个问题的方式之一便是采用双重认证,可能要求用户输入一个随机生成的密码。攻击者可能会获得你的密码,同样他们也很可能物理获取显示随机PIN值的设备。然而,身份验证可以做到的远远不止这样,它不仅要检测你是否知道你的密码,以及你的密码是什么,更要知道你是谁(如iPhone中TouchID就是对生物识别的应用)。现在有一个有意思的行为生物识别是“你是如何打字的”,或称为输入行为生物识别技术。击键识别技术真实情况就是人在打字的方式是有不同的。而这种差异很大程度上是视觉无法捕捉到的,但是电脑却可以通过观察区分出不同的打字者。例如,你敲击不同按钮时所间隔的时间、你指尖按压每个字符按钮

  • 腾讯云堡垒机查询资产组成员列表api接口

    1.接口描述接口请求域名:dasb.tencentcloudapi.com。 查询资产组成员列表 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:DescribeDeviceGroupMembers。 Version 是 String 公共参数,本接口取值:2019-10-18。 Region 是 String 公共参数,详见产品支持的地域列表。 Id 是 Integer 资产组ID Bound 是 Boolean true-查询已在该资产组的资产,false-查询未在该资产组的资产 Name 否 String 资产名或资产IP,模糊查询 Offset 否 Integer 分页偏移位置,默认值为0 Limit 否

  • ios crash的原因与抓取crash日志的方法

    首先我们经常会闪退的异常有哪些呢?crash的产生来源于两种问题:违反iOS策略被干掉,以及自身的代码bug。 1.IOS策略 1.1低内存闪退 前面提到大多数crash日志都包含着执行线程的栈调用信息,但是低内存闪退日志除外,这里就先看看低内存闪退日志是什么样的。 我们使用Xcode5和iOS7的设备模拟一次低内存闪退,然后通过Organizer查看产生的crash日志,可以发现Process和Type都为Unknown: 1.2 Watchdog超时 Apple的iOS DeveloperLibrary网站上,QA1693文档中描述了Watchdog机制,包括生效场景和表现。如果我们的应用程序对一些特定的UI事件(比如启动、挂起、恢复、结束)响应不及时,Watchdog会把我们的应用程序干掉,并生成一份响应的crash报告。 1.3用户强制退出 一看到“用户强制退出”,首先可能想到的双击Home键,然后关闭应用程序。不过这种场景是不会产生crash日志的,因为双击Home键后,所有的应用程序都处于后台状态,而iOS随时都有可能关闭后台进程,所以这种场景没有crash日志。

  • 有关MVC的相关知识(一)

    1、MVC全名是ModelViewController,是模型(model)-视图(view)-控制器(controller)的缩写, 一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面, 在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传 统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。   2、MVC编程模式编辑 MVC是一种使用MVC(ModelViewController模型-视图-控制器)设计创建Web应用程序的模式:[1] Model(模型)表示应用程序核心(比如数据库记录列表)。 View(视图)显示数据(数据库记录)。 Controller(控制器)处理输入(写入数据库记录)。 MVC模式同时提供了对HTML、CSS和JavaScript的完全控制。 Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。  通常模型对象负责在数据库中存取数据。 View(视图)是应用程序中处理数据显示的部分。  通常视图是依据模型数据创建的。 Con

  • Spring -- 全注解下的IoC(3)

      依赖注入     1.定义基本的接口和类       目录结构            Person接口:   packagecom.com.example.demo4; /** *实现人类接口 */ publicinterfacePerson{ publicvoidservice(); //依赖的类 publicvoidsetAnimal(Animalanimal); }复制     Animal接口: packagecom.com.example.demo4; publicinterfaceAnimal{ publicvoiduse(); }复制     BusinessPersonimplementPerson: packagecom.com.example.demo4.imple; importcom.com.example.demo4.Animal; importcom.com.example.demo4.Person; importorg.springframework.beans.factory.annotation.Autowired; import

  • 【AtCoder】diverta 2019 Programming Contest 2

    diverta2019ProgrammingContest2 A-BallDistribution 特判一下一个人的,否则是\(N-(K-1)-1\) #include<bits/stdc++.h> #definefifirst #definesesecond #definepiipair<int,int> #definempmake_pair #definepbpush_back #definespaceputchar('') #defineenterputchar('\n') #defineeps1e-10 #defineba47 #defineMAXN100005 //#defineivorysi usingnamespacestd; typedeflonglongint64; typedefunsignedintu32; typedefdoubledb; template<classT> voidread(T&res){ res=0;Tf=1;charc=getchar(); while(c<'0'||c>'9'){ i

  • 用vue手脚架直接修改.vue文件会报错

    原因:设置了eslint,如果你不想有规范的js代码,可以重新初始化关掉eslint。UseESLinttolintyourcode?(Y/n)这一步选no 除了这个再就是非常规范的写了该空格空格该换行换行该tab键tab下 关闭eslint方法 在webpack.base.conf.js里面删掉下面: {test:/\.(js|vue)$/,loader:'eslint-loader',enforce:'pre',include:[resolve('src'),resolve('test')],options:{formatter:require('eslint-friendly-formatter')}}, 删除后不再报错 

  • Educational Codeforces Round 93 (Rated for Div. 2) 简要题解

    A 根据“两短边之和大于第三边”,可以直接判断\(a_1,a_2,a_n\)的大小关系即可。 intn,a[N]; intmain() { intT=read(); while(T--) { n=read(); rep(i,1,n)a[i]=read(); sort(a+1,a+1+n); intx=a[1],y=a[2],z=a[n]; if(x+y>z)puts("-1"); elseprintf("%d%d%d\n",1,2,n); } return0; } 复制 B 取一段0的话会使得两段1连在一起,显然会帮助对面得到更多的1,所以贪心策略就是按照极长连续1的长度从大到小贪心的取。 intn,m,a[N]; chars[N]; intmain() { intT=read(); while(T--) { m=0; scanf("%s",s+1); n=strlen(s+1); intcnt=0; rep(i,1,n) { if(s[i]=='0') { if(cnt)a[++m]=cnt; cnt=0; } elsecnt++; } if(cnt)a[++m]=cnt;

  • windows10-msys2-msvc编译ffmpeg4.4.2

    下载msys2 在msys2安装目录下创建文件 msys2_ffmpeg.bat call"D:\ProgramFiles\MicrosoftVisualStudio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" setMSYS2_PATH_TYPE=inherit msys2_shell.cmd 复制 双击运行msys2_ffmpeg.bat,测试配置,输出msvc的lib则配置生效 $echo$LIB 输出: D:\ProgramFiles\MicrosoftVisualStudio\2022\Enterprise\VC\Tools\MSVC\14.32.31326\ATLMFC\lib\x64;D:\ProgramFiles\MicrosoftVisualStudio\2022\Enterprise\VC\Tools\MSVC\14.32.31326\lib\x64;C:\ProgramFiles(x86)\WindowsKits\NETFXSDK\4.8\lib\um\x64;D:\WindowsKits\10\lib\

相关推荐

推荐阅读