VSIX:C#项目 重命名所有标识符(Visual Studio扩展开发)

        出于某种目的(合法的,真的合法的,合同上明确指出可以这样做),我准备了一个重命名所有标识符的VS扩展,用来把一个C#库改头换面,在简单的测试项目上工作很满意,所有标识符都被准确替换。我还尝试用在C++项目上,问题就比较多了,因为VS并不能准确识别代码,这说明,C#比C++好用太多了。

        当然,最终合同被放弃了,所以这个东西也没派上用场,纯粹成了我的个人练习(因为没有人指派我做这个程序)。

        本文涉及的代码支持2017、2019和2022,为了稳妥起见,项目本身用不同版本的VS创建,实际代码则放在一个共享文件中,只需要在生成的框架之加入一句调用代码即可。

目录

一、创建项目框架

1.1 新建VS项目

1.2 添加命令

1.3 测试此框架代码

二、引入实际代码

2.1 添加项目文件

2.2 添加依赖项

三、修改代码

四、测试实际效果

4.1 创建测试项目

4.2 在VSIX项目打开测试项目

4.3 效果

五、代码


        

一、创建项目框架

1.1 新建VS项目

        以下均以VS2022社区版为例。

        项目类型过滤选择“扩展”,项目类型为“VSIX Project”。

1.2 添加命令

        创建以后在项目上右键,“添加”-“新建项”:

        “Command”就是一个菜单命令,会出现在VS的“工具”菜单下面。

        添加之后会看到增加了一个文件:Command1.cs,当然如果你改了命令名就是另外一个文件。

        文件不长,直接拉到最后,看最后一个方法的代码:

		/// <summary>/// This function is the callback used to execute the command when the menu item is clicked./// See the constructor to see how the menu item is associated with this function using/// OleMenuCommandService service and MenuCommand class./// </summary>/// <param name="sender">Event sender.</param>/// <param name="e">Event args.</param>private void Execute(object sender, EventArgs e){ThreadHelper.ThrowIfNotOnUIThread();string message = string.Format(CultureInfo.CurrentCulture, "Inside {0}.MenuItemCallback()", this.GetType().FullName);string title = "Command1";// Show a message box to prove we were hereVsShellUtilities.ShowMessageBox(this.package,message,title,OLEMSGICON.OLEMSGICON_INFO,OLEMSGBUTTON.OLEMSGBUTTON_OK,OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);}

        好简单的,猜也能猜到就是显式一个消息框。

1.3 测试此框架代码

        编译项目,应该没什么问题(全是开发工具生成的代码嘛)。

        调试或者直接运行不调试(“调试菜单”的“开始执行(不调试)”),会打开一个新的VS2022窗口,像普通VS一样,但是已经加载了扩展。

        选择项目,或者不选择项目直接进入。不选择项目直接进入(点击“继续但无需代码”):

        工具菜单下会出现“Invoke Command1”(图中还有另外一个相似菜单,是我的正式项目创建的),点击出现:

        这框架就算完成了,剩下的就是修改命令代码。

二、引入实际代码

2.1 添加项目文件

        在项目上右键,“添加”-“现有项”,找到实际代码文件添加进来,当然你也可以直接放在项目里面,但是因为VS扩展项目是依赖VS版本的,最好把通用部分独立出来。

        这个位置是在项目之外的,可以由多个项目共享。

2.2 添加依赖项

        文件加进来之后不能编译:

        因为缺少依赖项,在“项目”-“引用”上右键,“添加引用”:

        在“程序集”-“扩展”里面找到“Microsoft.VisualStudio.VCCodeModel”,选中,确定。

        然后程序就可以编译了。这个依赖项其实只和C++项目功能有关。

        如果发生奇怪错误:

严重性	代码	说明	项目	文件	行	禁止显示状态
错误		CreatePkgDef : error : ArgumentException: No Visual Studio registration attribute found in this assembly.
The assembly should contain an instance of the attribute 'Microsoft.VisualStudio.Shell.RegistrationAttribute' defined in assembly 'Microsoft.VisualStudio.Shell.Framework' version '17.0.0.0' 在 Microsoft.VisualStudio.Tools.CreatePkgDef.ProcessAssembly(String fileName, Hive hive, PkgDefContext context, Boolean register, RegistrationMode mode) 位置 D:\a\_work\1\s\src\product\vssdk\tools\CreatePkgDef\CreatePkgDef.cs:行号 383在 Microsoft.VisualStudio.Tools.CreatePkgDef.DoCreatePkgDef(InputArguments inputArguments) 位置 D:\a\_work\1\s\src\product\vssdk\tools\CreatePkgDef\CreatePkgDef.cs:行号 202在 Microsoft.VisualStudio.Tools.CreatePkgDef.Main(String[] arguments) 位置 D:\a\_work\1\s\src\product\vssdk\tools\CreatePkgDef\CreatePkgDef.cs:行号 91	VSIXProject1			

        不要尝试任何解决方案,删除刚才添加的东西也没用,整个过程删掉重来。这可能是VS的BUG。

三、修改代码

        现在我们可以将代码引入,在Command1.cs里面添加如下内容:

//文件头添加对共享代码的引用
using VSIXProjectShare;
using Task = System.Threading.Tasks.Task;//在类里面添加变量,就近放在构造函数前面好了private CommandShare commandshare;//构造函数最后加上这一句commandshare = new CommandShare(this.package);//Execute最后加一句commandshare.Execute();

        最终的Command1.cs是这样的(四处修改在里面已经注明):

using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using System;
using System.ComponentModel.Design;
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;
using VSIXProjectShare;//第一处修改
using Task = System.Threading.Tasks.Task;namespace VSIXProject1
{/// <summary>/// Command handler/// </summary>internal sealed class Command1{/// <summary>/// Command ID./// </summary>public const int CommandId = 0x0100;/// <summary>/// Command menu group (command set GUID)./// </summary>public static readonly Guid CommandSet = new Guid("16dcb30d-2f74-4781-bde4-c21c60716ac8");/// <summary>/// VS Package that provides this command, not null./// </summary>private readonly AsyncPackage package;private CommandShare commandshare;//第二处修改/// <summary>/// Initializes a new instance of the <see cref="Command1"/> class./// Adds our command handlers for menu (commands must exist in the command table file)/// </summary>/// <param name="package">Owner package, not null.</param>/// <param name="commandService">Command service to add command to, not null.</param>private Command1(AsyncPackage package, OleMenuCommandService commandService){this.package = package ?? throw new ArgumentNullException(nameof(package));commandService = commandService ?? throw new ArgumentNullException(nameof(commandService));var menuCommandID = new CommandID(CommandSet, CommandId);var menuItem = new MenuCommand(this.Execute, menuCommandID);commandService.AddCommand(menuItem);commandshare = new CommandShare(this.package);//第三处修改}/// <summary>/// Gets the instance of the command./// </summary>public static Command1 Instance{get;private set;}/// <summary>/// Gets the service provider from the owner package./// </summary>private Microsoft.VisualStudio.Shell.IAsyncServiceProvider ServiceProvider{get{return this.package;}}/// <summary>/// Initializes the singleton instance of the command./// </summary>/// <param name="package">Owner package, not null.</param>public static async Task InitializeAsync(AsyncPackage package){// Switch to the main thread - the call to AddCommand in Command1's constructor requires// the UI thread.await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(package.DisposalToken);OleMenuCommandService commandService = await package.GetServiceAsync(typeof(IMenuCommandService)) as OleMenuCommandService;Instance = new Command1(package, commandService);}/// <summary>/// This function is the callback used to execute the command when the menu item is clicked./// See the constructor to see how the menu item is associated with this function using/// OleMenuCommandService service and MenuCommand class./// </summary>/// <param name="sender">Event sender.</param>/// <param name="e">Event args.</param>private void Execute(object sender, EventArgs e){ThreadHelper.ThrowIfNotOnUIThread();string message = string.Format(CultureInfo.CurrentCulture, "Inside {0}.MenuItemCallback()", this.GetType().FullName);string title = "Command1-d";//修改这里以确认版本// Show a message box to prove we were hereVsShellUtilities.ShowMessageBox(this.package,message,title,OLEMSGICON.OLEMSGICON_INFO,OLEMSGBUTTON.OLEMSGBUTTON_OK,OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);commandshare.Execute();//第四处修改}}
}

        然后编译执行(仍然用“继续但无需代码”):

        看,版本正确,这是一个小技巧,debug发生困惑的时候先确认版本,不要编译失败执行旧版本。

        这就对了,因为共享代码需要项目来操作。这说明共享代码也正确进去了。后面就可以测试实际效果,共享代码放在本文最后。

四、测试实际效果

4.1 创建测试项目

        创建一个C#项目,一个对话框好了:

        一个对话框,有个静态文本,窗口初始化设置了一下文本。

4.2 在VSIX项目打开测试项目

        先创建好这个项目,然后回到VSIX项目,调试或运行,在新打开的VS启动时选择新建的这个项目,打开后是和普通VS一样操作的,只不过多了扩展菜单项。

        现在从工具菜单执行我们的命令,运行时会在输出窗口输出内容,最后会得到一个消息框:

        这就表示正确完成,提示信息是共享代码最后的版本,就是日期和时间。

        输出窗口输出如下:

        注意:此时修改的文件还没保存,要点击“全部保存”来保存文件。

        然后我们看看效果如何,现重新编译程序确认测试项目是正常的。

4.3 效果

        看看代码变成了什么样:

        Form1.Designer.cs就不贴了。

        看看文件比较:

五、代码

        共享代码在此,文件名CommandShare.cs:

using System;
using System.ComponentModel.Design;
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using Task = System.Threading.Tasks.Task;using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.VCCodeModel;
using System.IO;
using Microsoft.Internal.VisualStudio.PlatformUI;namespace VSIXProjectShare
{public sealed class CommandShare{private readonly AsyncPackage package;enum ProjectType { VC,CSharp,OTHER};//项目类型ProjectType projectType;private Random r ;//随机数private string new_name_title;//新名称标题private long count = 0;//顺序编号public CommandShare(AsyncPackage _package){package = _package;Log("初始化插件");r = new Random();new_name_title = "_ASDFGHJKL_" + r.Next().ToString() + "_";}//显示消息对话框private void ShowMessageBox(string title, string message){VsShellUtilities.ShowMessageBox(package,message,title,OLEMSGICON.OLEMSGICON_INFO,OLEMSGBUTTON.OLEMSGBUTTON_OK,OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);}//输出日志private void Log(string msg){Log(0,msg);}private void Log(int level,string msg){ThreadHelper.ThrowIfNotOnUIThread();IVsOutputWindowPane pane = (IVsOutputWindowPane)Package.GetGlobalService(typeof(SVsGeneralOutputWindowPane));int tmp = pane.Activate();if (VSConstants.S_OK != tmp){ShowMessageBox("注意", "未能激活输出窗口 " + tmp.ToString());}for (int i = 0; i < level; ++i){pane.OutputStringThreadSafe("    ");}pane.OutputStringThreadSafe(msg + "\r\n");}private void AddFunction_myToString(int level, VCCodeElements codeElements){ThreadHelper.ThrowIfNotOnUIThread();IVsOutputWindowPane pane = (IVsOutputWindowPane)Package.GetGlobalService(typeof(SVsGeneralOutputWindowPane));string px = new string(' ', level * 4);string px2 = new string(' ', 4);px = level.ToString() + px;string fun_name = "myToString";string fun_type = "stringstream &";vsCMFunction fun_kind = vsCMFunction.vsCMFunctionFunction | vsCMFunction.vsCMFunctionConstant;foreach (VCCodeElement element in codeElements){Log(px + "Kind " + element.Kind.ToString() + " Name " + element.Name);if (0 != element.Children.Count){AddFunction_myToString(level + 1, element.Children as VCCodeElements);}if (element.Kind == vsCMElement.vsCMElementClass || element.Kind == vsCMElement.vsCMElementStruct){VCCodeElement Found = null;string bodytext = "";//基类必须首先处理foreach (VCCodeElement chileren in element.Children){if (chileren.Kind == vsCMElement.vsCMElementVCBase){Log(px + px2 + "基类 " + chileren.Name);bodytext += "\t\t " + chileren.Name + "::myToString(ss) << \" \";\r\n";}}foreach (VCCodeElement chileren in element.Children){Log(px + px2 + chileren.Name + " Kind " + chileren.Kind);if (chileren.Kind == vsCMElement.vsCMElementVariable){VCCodeVariable variable = (VCCodeVariable)chileren;Log(px + px2 + "变量 Name " + variable.Name + " TypeString " + variable.TypeString+ " StartPoint " + variable.StartPoint.Line + " " + variable.StartPoint.LineCharOffset+ " EndPoint " + variable.EndPoint.Line + " " + variable.EndPoint.LineCharOffset);if (variable.TypeString.EndsWith(")")){bodytext += "\t\t ss << \"函数指针 " + variable.Name + " \" << " + variable.Name + " << \" \";\r\n";}else if (variable.TypeString.EndsWith("]")){bodytext += "\t\t ss << \"数组 " + variable.Name + " \" << " + variable.Name + " << \" \";\r\n";}else{bodytext += "\t\t Template_" + fun_name + "(" + variable.Name + ", ss) << \" \";\r\n";}}else if (chileren.Kind == vsCMElement.vsCMElementFunction){if (chileren.Name == fun_name){Found = chileren;Log(px + px2 + fun_name + " 已存在,重新创建");}}}VCCodeFunction codeFunction;if (element.Kind == vsCMElement.vsCMElementClass){VCCodeClass codeClass = (VCCodeClass)element;codeClass.RemoveMember(Found);codeFunction = (VCCodeFunction)codeClass.AddFunction(fun_name, fun_kind, fun_type, -1, vsCMAccess.vsCMAccessPublic);}else{VCCodeStruct codeClass = (VCCodeStruct)element;codeClass.RemoveMember(Found);codeFunction = (VCCodeFunction)codeClass.AddFunction(fun_name, fun_kind, fun_type, -1, vsCMAccess.vsCMAccessPublic);}codeFunction.AddParameter("ss", "stringstream &");codeFunction.Comment = "自动生成的代码";bodytext += "\t\t return ss;";codeFunction.BodyText = bodytext;}}}private void CSharp_Rename(int level, CodeElements codeElements){ThreadHelper.ThrowIfNotOnUIThread();foreach (CodeElement _element in codeElements){Log(level, "Kind " + _element.Kind.ToString());string name = "未知";//Name属性不是每个都有if (_element.Kind == vsCMElement.vsCMElementImportStmt){name = "vsCMElementImportStmt";}else{name = _element.Name;//这个竟然不是每个都支持}CodeElement2 element = (CodeElement2)_element;Log(level, "Kind " + element.Kind.ToString() + " Name " + name + " type " + element.GetType().ToString());//处理子项if (0 != element.Children.Count){CSharp_Rename(level + 1, element.Children);}bool skip = false;//是否需要跳过//检查是否已经处理过if (name.StartsWith(new_name_title)){skip = true;}if (element.Kind == vsCMElement.vsCMElementVariable){CodeVariable variable = (CodeVariable)element;Log(level + 1, "变量 Name " + variable.Name+ " StartPoint " + variable.StartPoint.Line + " " + variable.StartPoint.LineCharOffset+ " EndPoint " + variable.EndPoint.Line + " " + variable.EndPoint.LineCharOffset);}else if (element.Kind == vsCMElement.vsCMElementFunction){Log(level + 1, "函数 " + name);if (name.Equals("Main")){Log(level + 1, "Main函数(跳过) " + name);skip = true;}if (name.Equals("Dispose")){Log(level + 1, "Dispose函数(跳过) " + name);skip = true;}}else if (element.Kind == vsCMElement.vsCMElementNamespace){Log(level + 1, "命名空间 " + name);//skip = true;}else if (element.Kind == vsCMElement.vsCMElementAttribute){Log(level + 1, "属性(跳过) " + name);skip = true;}else if (element.Kind == vsCMElement.vsCMElementImportStmt){Log(level + 1, "导入语句(跳过) " + name);skip = true;}else if (element.Kind == vsCMElement.vsCMElementOther){Log(level + 1, "vsCMElementOther(跳过) " + name);skip = true;}if (!skip){Log(level, "重命名 " + name + "(" + element.Kind.ToString() + ") 为 " + new_name_title + count.ToString());element.RenameSymbol(new_name_title + count.ToString());count++;Log(level, "重命名完成");}}}private void ProcessProjectItem(int level, ProjectItem projectItem){ThreadHelper.ThrowIfNotOnUIThread();//项目下的筛选器Log(level, "===============目录:" + projectItem.Name + " 项目子项FileCount:" + projectItem.FileCount.ToString());for (short i = 0; i < projectItem.FileCount; i++){Log(3, "文件名:" + projectItem.FileNames[i]);}if (projectType == ProjectType.CSharp && projectItem.Name == "Properties"){Log(3, "C#项目忽略属性目录");return;}if (null != projectItem.FileCodeModel){String language = "未知语言";switch (projectItem.FileCodeModel.Language){case CodeModelLanguageConstants.vsCMLanguageVC:language = "VC";AddFunction_myToString(5, projectItem.FileCodeModel.CodeElements as VCCodeElements);break;case CodeModelLanguageConstants.vsCMLanguageIDL:language = "IDL";Log(3, "未支持的语言 " + language);break;case CodeModelLanguageConstants.vsCMLanguageVB:language = "VB";Log(3, "未支持的语言 " + language);break;case CodeModelLanguageConstants.vsCMLanguageMC:language = "MC";Log(3, "未支持的语言 " + language);break;case CodeModelLanguageConstants.vsCMLanguageCSharp:language = "CSharp";Log(3, "语言 " + language);if (null == projectItem) Log(3, "语言1" + language);if (null == projectItem.FileCodeModel) Log(3, "语言 2" + language);if (null == projectItem.FileCodeModel.CodeElements) Log(3, "语言 3" + language);Log(3, "语言 " + language);CSharp_Rename(5, projectItem.FileCodeModel.CodeElements);break;}}foreach (ProjectItem current_project_item_item in projectItem.ProjectItems){ProcessProjectItem(level + 1, current_project_item_item);}}public void Execute(){ThreadHelper.ThrowIfNotOnUIThread();string message = string.Format(CultureInfo.CurrentCulture, "Inside {0}.MenuItemCallback()", this.GetType().FullName);string title = "Command1 2023-04-20 1720";// Show a message box to prove we were here//VsShellUtilities.ShowMessageBox(//    this.package,//    message,//    title,//    OLEMSGICON.OLEMSGICON_INFO,//    OLEMSGBUTTON.OLEMSGBUTTON_OK,//    OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);Log(title);try{DTE2 dte = (DTE2)Package.GetGlobalService(typeof(SDTE));Log("DTE:" + dte.Version);Log("DTE:" + dte.Name);Log("DTE:" + dte.Edition);Log("DTE:" + dte.Mode);var solution = dte.Solution;var SolutionName = Path.GetFileName(solution.FullName);     //解决方案名称var SolutionPath = Path.GetDirectoryName(solution.FullName);//解决方案路径Log("解决方案:" + solution.ToString());Log("解决方案FileName:" + solution.FileName);Log("解决方案FullName:" + solution.FullName);Log("解决方案GetFileName:" + SolutionName);Log("解决方案GetDirectoryName:" + SolutionPath);Log("解决方案Count:" + solution.Count);Log("解决方案Projects.Count:" + solution.Projects.Count);foreach (Project current_project in solution.Projects){//解决方案下的项目Log(1, "--------------------------Language:" + current_project.CodeModel.Language);if (current_project.CodeModel.Language == "{B5E9BD34-6D3E-4B5D-925E-8A43B79820B4}"){projectType = ProjectType.CSharp;}else if (current_project.CodeModel.Language == "{B5E9BD32-6D3E-4B5D-925E-8A43B79820B4}"){projectType = ProjectType.VC;}else{projectType = ProjectType.OTHER;}Log(1, "--------------------------项目:" + current_project.Name + " 类型 " + projectType + " 项目子项个数:" + current_project.ProjectItems.Count.ToString());foreach (ProjectItem current_project_item in current_project.ProjectItems){ProcessProjectItem(2, current_project_item);}}ShowMessageBox(title, "操作完成");}catch (Exception ex){ShowMessageBox("", ex.Message);}}}
}

        这个代码对C#项目执行CSharp_Rename,对C++项目则执行AddFunction_myToString,功能是给所有结构添加toString函数,尚不完善,所以无视即可(我挺希望别人能把这个功能做出来)。

        代码分析看这里:VSIX:C#项目 重命名所有标识符(Visual Studio扩展开发)代码详解-CSDN博客。

(这里是结束)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/130688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot-SpringCache缓存

文章目录 Spring Cache 介绍常用注解 Spring Cache 介绍 Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache 提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;…

产品经理入门学习(一):认识产品经理

参考引用 黑马-产品经理入门基础课程 1. 合格的产品经理 1.1 什么是产品 上述产品的共性&#xff1a;解决某个问题的东西上述产品的区别 有形&#xff08;上图左&#xff09;&#xff1a;颜色、形状、质地和尺寸无形&#xff08;上图右&#xff09;&#xff1a;脑力劳动成果、…

STM32WB55开发(6)----FUS更新

STM32WB55开发.6--FUS更新 概述视频教学硬件准备存储器映射FLASH安全区设置SRAM安全区设置通过USB进行下载注意事项 概述 在 STM32WB 微控制器中&#xff0c;FUS&#xff08;Firmware Upgrade Services&#xff09;是用于固件升级的一种服务。这项服务可以让你更新设备上的无…

vue3视频大小适配浏览器窗口大小

目标&#xff1a;按浏览器窗口的大小&#xff0c;平铺视频&#xff0c;来适配屏幕的大小。 考虑使用 DPlayer.js、video.js、vue-video-player等视频插件&#xff0c;但报了各种各样的错&#xff1b;试过使用 js 对视频进行同比例放大&#xff0c;再判断其与窗口的大小取最小值…

按键精灵中常用的命令

1. 声明变量&#xff1a; Dim 2. 注释语句 (1). 单行注释&#xff1a;这是一行注释&#xff0c;使用一个单引号进行注释&#xff1b; (2). 单行注释&#xff1a;// 这是一行注释&#xff0c;使用一对反斜杠进行注释; (3). 多行注释&#xff1a;/*这是多行注释&#xff0c;中…

R语言_RColorBrewer包--全平台可用

R语言_RColorBrewer包–全平台可用

送你几款开源IDC资产管理系统

更多运维技术&#xff0c;请关注微信公众号“运维之美” 送你几款开源IDC资产管理系统 1.phpIPAM2.NetBox3.IPPlan4.GestiIP5.RackTables 对于公司机房运维人员来说&#xff0c;你的idc资产管理清单可能还记录在各种excel表格中&#xff0c;当设备和ip变动的时候进行手动更新&a…

解锁无限可能:ON1 Photo RAW的新功能与优势forMac/win

作为摄影师&#xff0c;您是否曾为繁琐的照片编辑过程而感到困扰&#xff1f;是否希望有一种工具&#xff0c;能将您的照片编辑过程变得更加高效、灵活&#xff0c;同时不损失画质&#xff1f;如果是&#xff0c;那么您一定不能错过ON1 Photo RAW。 ON1 Photo RAW是一款全新的…

Spring Boot整合Swagger

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

奇元大模型通过备案 360自研两大模型均获批

11月4日&#xff0c;三六零(601360.SH&#xff0c;下称“360”)大模型“奇元大模型”通过备案落地。今年9月&#xff0c;“360智脑大模型”已获批面向公众开放。360公司也成为国内首家两个大模型均通过备案的科技企业。 从大模型定位和应用角度来看&#xff0c;奇元大模型具备…

单目标应用:粒子群优化算法(PSO)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、粒子群优化算法&#xff08;PSO&#xff09;求解微电网优化 &#xff08;1&#xff09;部分代码 close all; clear ; clc; global P_load; %电负荷 gl…

Android Gldie复用只取之前decode过的缓存resource,Kotlin

Android Gldie复用只取之前decode过的缓存resource&#xff0c;Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.life…

react_11

MobX 介绍 需求&#xff0c;组件0 改变了数据&#xff0c;其它组件也想获得改变后的数据&#xff0c;如图所示 这种多个组件之间要共享状态数据&#xff0c;useState 就不够用了&#xff0c;useContext 也不好用了 能够和 react 配合使用的状态管理库有 MobX Redux 其中…

Java高频面试题——Java基础篇

java基本数据类型及对应的字节数&#xff1f;什么是自动拆装箱&#xff1f;int与integer的区别&#xff1f;项目中如何使用&#xff1f; 1.java基本数据类型及对应的字节数&#xff1f; java总共有8中基本数据类型&#xff0c;整型4种&#xff0c;浮点型2种&#xff0c;字符类…

k8s集群调度

目录 1、理论&#xff1a; 1.1、 概述&#xff1a; 1.2、Pod 是 Kubernetes 的基础单元&#xff0c;Pod 启动典型创建过程如下&#xff1a; 工作机制 **** 1.3、调度过程 *** 1.4、Predicate 有一系列的常见的算法可以使用&#xff1a; ** 1.5、 优先级由一系列键…

docker 常用

系统 Ubuntu 20.04 64位 安装文档 ubuntu&#xff1a;https://docs.docker.com/engine/install/ubuntu/ centos&#xff1a;https://docs.docker.com/engine/install/centos/ debian&#xff1a;https://docs.docker.com/engine/install/debian/ 常用命令 查看镜像 docke…

APP攻防--ADB基础

进入app包 先使用 adb devices查看链接状态 手机连接成功的 adb shell 获取到手机的一个shell 此时想进入app包时没有权限的&#xff0c;APP包一般在data/data/下。没有执行权限&#xff0c;如图 Permission denied 权限被拒绝 此时需要手机root&#xff0c;root后输入 su …

Java通过cellstyle属性设置Excel单元格常用样式全面总结

最近做了一个导出Excel的功能&#xff0c;导出是个常规导出&#xff0c;但是拿来模板一看&#xff0c;有一些单元格的样式设置&#xff0c;包括合并&#xff0c;背景色&#xff0c;字体等等&#xff0c;毕竟不是常用的东西&#xff0c;需要查阅资料完成&#xff0c;但是搜遍全网…

ConnectionError: HTTPSConnectionPool

ConnectionError: HTTPSConnectionPool(host‘zbbfxstatic.figtingdream.com’, port443): Max retries exceeded with url: /api/cache (Caused by NewConnectionError(‘<urllib3.connection.HTTPSConnection object at 0x00000249795AD9A0>: Failed to establish a ne…

Kubernetes技术与架构-存储 3

如上所示&#xff0c;Kubernetes集群的存储层支持不同类型的存储资源&#xff0c;其提供Projected类型的存储功能整合多种存储资源&#xff0c;将secret、downwardAPI、configMap三种不同类型的存储资源整合成一个挂载到Pod的容器实例中 如上所示&#xff0c;整合两个secret类型…