利用Visual Studio 2017的扩展开发(VSIX、ItemTemplate) 快速实现项目的半自动化搭建

使用Visual Studio中的Item Template 通常visual studio的默认文件模版并不能满足我们的需求. 下面是默认的由vs2008创建的类Class2.csusing System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using System.Web.Security;using System.We 阅读详情

目录

0.引言

1.什么是Visual Studio项目模板

2.IWizad接口

3.通过Visual Studio扩展开发实现领域驱动开发

3.1 使用VSIX+ProjectTemplate创建项目模板

3.2使用ItempTemplate创建自定义项模板

3.3实现可视化添加实体字段,自动生成应用层(Dto、IAppService、AppService)、领域层(Entity)、展现层(Views、Controller)、基础设施层(IRepository)等。

4.结语


0.引言

        最近一直在学习博客【老张的哲学】的.NET Core2.0 Api + Vue 2.0的系列文章,通过边看边自己动手实践,自己对一些概念有了更深入的理解(如依赖注入、前端的一些知识、VUE框架),本来也计划好通过该系列文章好好学习一下VUE框架并应用到实际的项目中的,特此还重点突击了一个星期左右,但最后发现自身功力不够(毕业3年都没有敲过代码,加之之前只是做过一些win form的简单开发,Web知识还是比较欠缺的,由于工作的需要今年才重新捡起来),所以是后还是放弃了。哈哈,扯远了......下面开始进入正题

       在【老张的哲学】的系列教程第32篇博文中博主主要介绍了快速实现项目的半自动化搭建的四种方式:动软代码生成器、VSTO、T4模板、SqlSuagr等,按我的理解我觉得这几种方式,无非就是事先定义好一些模板,然后按各自的方法生成相应的文件(好像这句话等于没有说,哈哈.....),这几种方式确实在实际的工作中可以减少很多重复性的工作,而且自己通过这大半年的开发工作中,也深有感触是很有必要找到一种适合的方式来减少这些不必要的工作量(不瞒大家说,也不怕大家笑话,最近的项目开发中的CRUD真的是我自己一行一行敲出来的),今天的话主要在博主的基础上在介绍另外一种方式:VSIX插件+ItemTemplate+ProjectTemplate来实现同样的目的,这里的话主要是介绍基础的,后面在根据项目的需要完善。本人也没有写过技术博客,如果写得不好或有误,请大家多多包含和批评指正。

1.什么是Visual Studio项目模板

       说了那么多,大家可能还是比较蒙圈(也可能是我没有解释清楚),直接来3张图(如下所示),在平常的开发过程中,大家肯定经常通过在项目中右键创建类、接口、Windows窗体、用户控件等,其实这些就是Visual Studio自身提供的一些模板,如新建一个Windows窗体后,窗体的大小、颜色、显示的名称都已经定义好了,不需要用户在敲一大堆代码才能把这个窗体显示出来,本文就是通过这种方式快速实现项目的半自动化搭建。

【新建项】

【新建Windows窗体】

【Form1】

 

2.IWizad接口

       在开始操作前,首先说说“IWizard”接口:

       Visual Stdudio提供了IWizard接口,该接口提供了几个方法帮助用户在创建模板项时可运行自定义的代码,见下表,本文就是通过这个接口实现的。

 NameDescription
System_CAPS_pubmethodBeforeOpeningFile(ProjectItem)

Runs custom wizard logic before opening an item in the template.

System_CAPS_pubmethodProjectFinishedGenerating(Project)

Runs custom wizard logic when a project has finished generating.

System_CAPS_pubmethodProjectItemFinishedGenerating(ProjectItem)

Runs custom wizard logic when a project item has finished generating.

System_CAPS_pubmethodRunFinished()

Runs custom wizard logic when the wizard has completed all tasks.

System_CAPS_pubmethodRunStarted(Object, Dictionary<String, String>, WizardRunKind, Object[])

Runs custom wizard logic at the beginning of a template wizard run.

System_CAPS_pubmethodShouldAddProjectItem(String)

Indicates whether the specified project item should be added to the project.

3.通过Visual Studio扩展开发实现领域驱动开发

3.1 使用VSIX+ProjectTemplate创建项目模板

        什么是领域驱动开发,哈哈......有兴趣的可以去深入了解一下,之所以提起这个概念,主要是最近在Github上了解到ABP这个开源项目,目前start的人数多达5.5k,网址asp.net boilerplate,这个框架比较好的实现了领域驱动开发这个概念(据说也不是完全符合领域驱动设计的概念,具体的话还需要自己深入了解学习),自我认为这是个比较好的学习框架,里面涉及到比较多新的技术和知识(对于我来说基本上是新知识),大家有时间可以抽空看看,后期我也计划把该框架应用到实际的项目中去,哈哈......又扯远了。

 下面正式进入正题:

1.创建项目模板,命名为FirstProjectTemplate。并打开该项目下的Class1.cs文件,随意输入一些注释,有啥用?请耐心等待。

备注:如果没有Extensibility这个分类,请在更新与扩展里安装。

2.添加新的VSIX项目,命名为FirstProjectWizard,并把该项目设置为启动项目。

3.在FirstProjectWizard项目中双击打开source.extension.vsixmaifest文件,填写Product Name、Author、Version、Desription等基本信息。

4.在3打开的文件中,在左侧栏中切换到Assets选项卡,单击【New】新建一个Asset(中文不知道翻译成啥好,哈哈...),Type选择Microsoft.VisualStudio.ProjectTemplate,Source选择A Project in current solution,Project选择FirstProjectTemplate,其它设置见图。

5.按F5 生成解决方案并启动调试,将打开另一个Visual Studio实例(这可能需要几分钟的时间,电脑配置好点估计秒开...),仔细的估计会注意到Visual Studio窗口多了【实验实例】几个字,这个具体拿来干啥的,有兴趣的可以百度一下,哈哈...

6.在刚刚打开的Visual Sdudio窗口新建一个项目,弹出的【新建项目】窗口,在右上角输入first,选中FirstProjectTemplate,单击确定。

7.打开刚新建项目中的Class1.cs,哦哦...刚在1步骤中注释的语句出现了,是不是尝到了胜利的味道。或许说到这里,大家已经大概了解到思路了,恭喜你离成功更靠近一步了....加油,请给点耐心哟。

3.2使用ItempTemplate创建自定义项模板

本节主要介绍通过自定义一些参数,实现在添加项时项模板能按要求输出,好了...话不多说,直接演示。

1.在3.1创建的解决方案中,新建一个项项目(ItemTemplate),命名FirstItemTemplate。

2.选中3.1中创建的FirstProjectWizard项目,按F4弹出属性窗口,设置如图三个属性字段为ture。

3.将FirstProjectWizard、FirstItemTemplate作为Asset添加到VSIX项目中。双击打开source.extension.vsixmanifest 文件,并切换到Asset窗口中,相关设置见下图。

【添加FirstProjectWizard】

【添加FirstItemTemplate】

【添加后的Asset】

4.添加VSIX开发要用到的相关类库。在FirstProjectWizard项目下的引用鼠标右键,添加

EnvDTE、Microsoft.VisualStudio.TemplateWizardInterface、System.Drawing、System.Windows、System.Windows.Forms等。

5.在FirstProjectWizard项目中添加类,并命名为WizardImplementation,并继承IWizard接口,具体代码如下:

using EnvDTE;
using Microsoft.VisualStudio.TemplateWizard;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FirstProjectWizard
{
    public class WizardImplementation : IWizard
    {
        private CustomFieldForm customFieldForm;
        private string customField;

        public void BeforeOpeningFile(ProjectItem projectItem)
        {
           
        }

        public void ProjectFinishedGenerating(Project project)
        {
           
        }

        public void ProjectItemFinishedGenerating(ProjectItem projectItem)
        {
            
        }

        public void RunFinished()
        {
            
        }

        public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
        {
            try
            { 
                customFieldForm = new CustomFieldForm();
                customFieldForm.ShowDialog();

                customField = CustomFieldForm.CustomField;

                //添加自定义参数 
                replacementsDictionary.Add("customField",
                    customField);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        public bool ShouldAddProjectItem(string filePath)
        {
            return true;
        }
    }
}

6.在FirstProjectWizard项目中添加Windows窗体,命名为CustomFieldForm,具体代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FirstProjectWizard
{
    public partial class CustomFieldForm : Form
    {
        private static string customField;

        public CustomFieldForm()
        {
            InitializeComponent();
        }

        public static string CustomField
        {
            get
            {
                return customField;
            }
            set
            {
                customField = value;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            customField = textBox1.Text;
        }
    }
}

7.添加程序集签名。选中FirstProjectWizard项目,右键单击,选中项目属性,切换到签名栏,勾选为程序集签名,输入秘钥文件名称key.snk,去掉勾选使用密码保护秘钥文件,相关设置见下图。

8.选中FirstProjectWizard项目,按F4弹出属性窗口,设置复制生成输出到输出目录字段true,并重新生成解决方案。

9.将刚生成的key.snk秘钥文件拷贝到C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools目录下,运行cmd(需要管理员身份运行),并cd到C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools该目录下,输入:

sn.exe -p key.snk outfile.key

10.从key.snk中获取公钥,在命令窗口输入,如图 并记下该公钥。

sn.exe -t outfile.key

11.将对自定义向导的引用添加到项目模板的.vstemplate 文件。分别找到FirstItemTemplate、FirstProjectTemplate项目中的两个vstemplate文件,在<TemplateContent>节点后面添加如下代码,最终如图。

  <WizardExtension>
    <Assembly>FirstProjectWizard, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=df318ff0a21a5d6d</Assembly>
    <FullClassName>FirstProjectWizard.WizardImplementation</FullClassName>
  </WizardExtension>

12.保存所有文件,并重新生成解决方案。按F5运行,打开刚刚创建的FirstProjectTemplate1项目,右键添加新项,弹出【添加新项】窗口,在右上角搜索first,哈哈...FirstItemTemplate出现啦...成功八九十

3.3实现可视化添加实体字段,自动生成应用层(Dto、IAppService、AppService)、领域层(Entity)、展现层(Views、Controller)、基础设施层(IRepository)等。

      好啦,通过3.1、3.2的介绍基本的框架已经搭建起来啦,下面就在ABP架构的基础上实现通过可视化添加实体,快速自动生成领域驱动设计各层的部分文件,注意只是部分哈,不要纠结是否符合领域驱动设计。

     在开始前,首先介绍一下【模板参数】,见下表,replacementsDictionary共有23个系统自带的参数,通过键值(Dictionary)保存,当然用户可以通过自定义参数添加到字典中,具体有什么作用,请见后文。

参数描述
clrversion公共语言运行时 (CLR) 的当前版本。
GUID [1-10]一个用于替换项目文件中的项目 GUID 的 GUID。 可指定最多 10 个唯一的 GUID(例如,guid1)。
itemname“添加新项”对话框中由用户提供的名称。
machinename当前的计算机名称(例如,Computer01)。
projectname“新建项目”对话框中由用户提供的名称。
registeredorganization来自 HKLM\Software\Microsoft\Windows NT\CurrentVersion\RegisteredOrganization 的注册表项值。
rootnamespace当前项目的根命名空间。 此参数仅适用于项模板。
safeitemname用户在“添加新项”对话框中提供的名称,名称中移除了所有的不安全字符和空格。
safeprojectname用户在“新建项目”对话框中提供的名称,名称中移除了所有的不安全字符和空格。
time以 DD/MM/YYYY 00:00:00 格式表示的当前时间。
SpecificSolutionName解决方案的名称。 在选中“创建解决方案目录”时,SpecificSolutionName 具有解决方案名称。 在未选中“创建解决方案目录”时,SpecificSolutionName 为空。
userdomain当前的用户域。
username当前的用户名称。
webnamespace当前网站的名称。 此参数在 Web 窗体模板中用于保证类名是唯一的。 如果网站在 Web 服务器的根目录下,则此模板参数会解析为 Web 服务器的根目录。
year以 YYYY 格式表示的当前年份。

1.在FirstItemTemplate项目中,双击打开vstemplate文件,找到文件自动生成的<ProjectItem>,随后跟着添加多几个<ProjectItem>,具体如下:

    <!--safeitemname	用户在“添加新项”对话框中提供的名称,名称中移除了所有的不安全字符和空格-->
    <ProjectItem ReplaceParameters="true" TargetFileName="$safeitemname$.cs">Core\Entity.cs</ProjectItem>
    <ProjectItem ReplaceParameters="true" TargetFileName="Temp\I$safeitemname$AppService.cs">Application\IAppService.cs</ProjectItem>
    <ProjectItem ReplaceParameters="true" TargetFileName="Temp\$safeitemname$AppService.cs">Application\AppService.cs</ProjectItem>
    <ProjectItem ReplaceParameters="true" TargetFileName="Temp\$safeitemname$Dto.cs">Application\EntityDto.cs</ProjectItem>
    <ProjectItem ReplaceParameters="true" TargetFileName="Temp\$safeitemname$ListDto.cs">Application\EntityListDto.cs</ProjectItem>
    <ProjectItem ReplaceParameters="true" TargetFileName="Temp\Index.cshtml">UI\Index.cshtml</ProjectItem>
    <ProjectItem ReplaceParameters="true" TargetFileName="Temp\Index.js">UI\Index.js</ProjectItem>
    <ProjectItem ReplaceParameters="true" TargetFileName="Temp\$safeitemname$Controller.cs">UI\Controller.cs</ProjectItem>
    <ProjectItem ReplaceParameters="true" TargetFileName="Temp\I$safeitemname$Repository.cs">Infrastructure\IRepository.cs</ProjectItem>

2.对照在1中添加的配置新建相应文件,如Entity.cs、IAppService.cs,最终结构见下图。

3.利用模板参数replacementsDictionary实现自定义项模板,如Entity.cs类如下图,其它按照自己的需求实现,思路就是用replacementsDictionary里的值进行替换,如果大家有更好的思路,欢迎大家提出。

using Abp.Domain.Entities;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;

namespace $rootnamespace$
{
    [Table("Abp$safeitemname$s")]
    public class $safeitemname$ : Entity<long>, IMayHaveTenant, IPassivable
	{
        //实现IMayHaveTenant,IPassivable
        public virtual int? TenantId { get; set; }
        public virtual bool IsActive { get; set; }

       //自定义的字段
       public virtual string $customField$ {get;set;}
    }
}

4.在WizardImplementation类的ProjectItemFinishedGenerating( )方法中,实现文件的放到指定的工程目录下。PS:目前的方法比较笨,主要实现思路是先根据模板生成文件,然后Copy一份到指定的目录,然后把源文件Delete。大家如有好的方法,请多多留言。代码如下:

        public void ProjectItemFinishedGenerating(ProjectItem projectItem)
        {
            //服务层
            if (projectItem.Name.IndexOf("AppService") > 0)
            {
                if (!projectItem.IsOpen) projectItem.Open();

                foreach (var item in _dte.Solution.Projects)
                {
                    var project = (Project)item;
                    //找到服务层的项目
                    if (project.Name.IndexOf("Application") > 0)
                    {
                        bool flagAppService = false;
                        ProjectItem folder = null;
                        foreach (var folderItem in project.ProjectItems)
                        {
                            var tmp = (ProjectItem)folderItem;
                            if (tmp.Name.IndexOf("AppService") > -1)
                            {
                                flagAppService = true;
                                folder = tmp;
                            }
                        }
                        //不存在文件夹则创建                 
                        if (!flagAppService)
                            folder = project.ProjectItems.AddFolder("AppService");

                        folder.ProjectItems.AddFromFileCopy(projectPath + @"AppService\" + projectItem.Name);
                    }
                }
            }
        }

5.继续按F5运行,打开Visual Studio【实验实例】,新建一个解决方案,包含两个工程,如下图:

6.在CenterInfo.Core工程中右键新建项,弹出添加新项对话框,找到FirstItemTemplate,命名为Depart。

7.弹出创建【Depart】实体对话框,这里主要模拟创建包含Name字段的实体类,单击确定。

8.哇...最终生成如下图,搞了半天就这么点东西。

4.结语

       终于写到结语了,说实话写个技术博客真不容易(这篇博客花了2天的时间收集资料,1天的时间自己动手实践,然后几个小时的时间完成编写)......在第3小节说好的【通过Visual Studio扩展开发实现领域驱动开发】,哈哈,都是骗人的,只是为了吸引大家的眼球,好啦,坑我就挖到这里,剩下的由大家把这个坑补完。

      (后续有时间会把【通过Visual Studio扩展开发实现领域驱动开发】实现,期待着...)

Visual Studio扩展性(第1天):创建您的第一个Visual Studio VSIX包 在这三篇关于Visual Studio Extensibility的系列文章中,我们将学习如何创建一个新的Visual Studio包,通过持续集成设置将其部署到暂存服务器和GIT上,最后,使用该嵌入式包创建一个Visual Studio隔离的Shell应用程序。本文介绍如何在Visual Studio中创建扩展以在Windows资源管理器中打开所选文件。 阅读详情

相关推荐

深入理解Visual Studio开发插件

本文还有配套的精品资源,点击获取 简介:Visual Studio开发插件,旨在增强或定制Visual Studio IDE的功能,自VS2003时代起,通过MPF和VSPackages两种方式实现了功能的扩展。本文章将详细解读VS插件的设计理念、开发技术和应用范围,帮助开发者快速掌握Visual Studio插件开发的精髓,理解如何通过插件提升开发效率和实现个性化开发环境...

weixin_42576467的博客 3996

Visual Studio扩展开发入门/VSIX/VSX/Exten

Visual Studio IDE扩展,也就是 Visual Studio插件,允许开发人员在 Visual Studio 中进行自定义,并增强其功能的的一种附加项,并集成到现有的 Visual Studio之中,实现某些特定的功能。扩展(插件)的复杂程度不一,但其主要用途在于提高工作效率并满足某些特定的工作流的需求。在微软的Visual Studio Marketplace中有数以千计的收费的、免费扩展插件,为Visual Studio提供了大量的定制化的功能,让Visual Studio成为“面向任何开发者的同类最佳工具”。虽然有如此之多的插件,是不是你却找不到你需要的哪一款? 你是不是想到了一个很棒的插件,但却还没人开发出来? 通过这门课的学习,你就可以立即开始创建属于你自己的扩展插件!本课程还为你演示如何将你的插件发布到Visual Studio Marketplace之中,供别人使用(收费、免费)。本课程使用最新的Visual Studio 2022为你详细演示每一个操作步骤,课程配套源码和文档将会上传至github网站,请在学习过程中参考。 

Visual Studio插件开发实战指南

Visual Studio作为微软旗舰级集成开发环境,凭借其高度可扩展的架构,支持开发者通过插件(Extension)深度定制IDE功能。VS插件基于组件化设计思想,以VSIX为部署单元,运行于独立的实验实例中,确保开发与生产环境隔离。插件类型涵盖菜单命令、编辑器增强、语言服务等,广泛应用于代码生成、智能提示、团队协作等场景。相较于传统宏脚本,现代插件通过VS SDK与MEF框架实现更强的稳定性与解耦性。掌握插件生命周期、对象模型访问机制及扩展点注册方式,是构建高效、安全扩展应用的基础。

weixin_28913879的博客 839

VisualStudio如何进行插件开发?

使用Visual Studio插件可以极大地提升开发效率、提供更好的集成环境、丰富扩展生态系统、方便调试和故障排除,并提供可视化设计和建模等功能。这些好处有助于开发人员更快速、高效地完成项目,并提供更好的用户体验。本文记录VisualStudio开发插件的过程。

【cacrle】的博客 5661

扩展Visual Studio功能:ProPowerTools.vsix介绍

VSIX(Visual Studio Integration Extension)是一个开放标准的包格式,用于Visual Studio扩展,支持从插件开发到分发的所有方面。VSIX格式类似于.NET Framework中的ClickOnce安装程序包,它将扩展的安装文件、元数据、依赖关系和其他资源包装在一个压缩文件中。VSIX包的文件扩展名是.vsix,它基于Open Packaging Conventions (OPC)标准,使得Visual Studio能够解析和安装VSIX包。

weixin_42506884的博客 1232

Windows 11下ROS2 Humble与PyCharm无缝集成实战(避坑指南+完整配置流程)

本文详细介绍了在Windows 11系统下如何实现ROS2 Humble与PyCharm的无缝集成,包括环境准备、ROS2 Humble安装、PyCharm配置以及C++与Qt5混合开发的实战技巧。通过避坑指南和完整配置流程,帮助开发者高效搭建稳定的机器人开发环境,特别适合Windows平台的ROS2开发者。

weixin_28710999的博客 366

VS插件(VSIX获取解决方案和项目信息)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、VSIX获取解决方案名称及解决方案路径二、使用步骤1.引入库2.读入数据 一、VSIX获取解决方案名称及解决方案路径 二、使用步骤 1.引入库 using EnvDTE; using EnvDTE80; using Microsoft.VisualStudio.Shell; using System.IO; 2.读入数据 a、解决方案名称和解决方案路径 var dte2 = Package.GetGlobalServi

zhoufei95的博客 1716

L298N电机驱动模块的接线使用与代码实现

#include "iostm8s208mb.h" #define u8 uint8_t #define u16 uint16_t #define u32 uint32_t typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; // 关于LED灯的宏定义 #define LED2 PI_ODR_ODR2 //输出量 #define LE

Clichong 13万+

VSIX调测插件开发

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 参考: https://www.codeproject.com/articles/13127/create-a-debugger-visualizer-in-lines-of-code http://www.cnblogs.com/sdwdjzhy/p/7300480.html https://...

春夜喜雨的专栏 3544

数据库和BI工程师面试题

 一.数据库 1.Oracle数据库,视图与表的区别?普通视图与物化视图的区别?物化视图的作用? 2.Oracle数据库,有哪几类索引,分别有什么特点? 3.Union与Union All的区别? 4.对游标的理解?游标的分类?使用方法? 5.如何查找和删除表中的重复数据?给出方法或SQL。 6.不借助第三方工具,怎么查看SQL的执行计划? 7.创建索引有哪些需要注意的要点?

web_go_run的专栏 1万+

人体分割笔记总结

人体分割 人体分割(human parsing),属于语义分割任务的子任务,旨在对人类图像进行像素级的是细粒度分割(例如,划分出身体部位和服装)。根据不同的场景,又可以分为单人人体解析(single-person human parsing)和多人人体解析(multi-person human parsing,或者 instance-level human parsing)。除此之外,按照处理媒介分类,还可以分为基于图像的人体解析和基于视频的人体解析。 对于人体解析任务,常用的度量指标包括 Pixel a

jacke121的专栏 4255

生产力提升! 自己动手自定义Visual Studio 2019的 类创建模板,制作简易版Vsix安装包...

序言最近一直在开发 webApi 接口,为了方便我采用了反Restful风格开发,90%的接口均采用post方式,小部分查询采用Get方式,接口的入参和出参定义每次都需要手动创建2个类,心...

dotNET跨平台 360

RTOS与Linux功能差异与应用场景全面对比

在嵌入式系统的开发中,操作系统的选择至关重要。和是两种广泛应用的操作系统,它们在功能、设计目标以及应用领域中各具优势。随着嵌入式系统的不断发展,已成为嵌入式行业的大趋势。那么,这两者到底有什么不同呢?

硬核科技 402

Visual Studio 项目模板制作(三)

前面,我们已经制作好了模板,然后放到相应的Template目录就可以在Visual Studio中使用 本篇,我们采用安装VSIX扩展的方式来安装模板,这种方式需要安装Visual Studio SDK 安装了SDK之后,可以在新建项目里面看到VSIX Project 选择VSIX Project 然后设置一下名称,点击确定,项目就新建完成了 项目结构: 现在我们开始 首...

weixin_30412013的博客 126

【数据湖仓】:Iceberg、Hudi 和 Paimon 对比

适用于需要多计算引擎支持和复杂查询的离线批处理场景。其中立性和灵活性使其成为构建新型数据平台的理想选择。:在需要高频数据更新和高效小文件管理的场景中表现出色,适合实时数据处理和增量数据更新的业务需求。:专为实时流式数据处理设计,适用于对数据实时性要求高的业务场景,如实时数据分析和实时指标监控。通过以上分析,可以看出 Apache Iceberg、Apache Hudi 和 Apache Paimon 各有其独特的优势和适用场景。企业应根据自身业务需求和技术栈选择合适的数据湖仓方案,以充分发挥其价值。

欢迎来到我的博客,一起探索代码里的世界! 1609

量化交易python代码解析:从狙击手算法到最优限价算法

在金融市场的竞技场上,量化交易如同一位冷静的策略大师,它以数学模型为剑,以计算机程序为盾,精准出击,捕捉市场的微妙波动。本文将深入探讨五种核心量化交易算法:直接委托算法(DMA)、时间加权平均算法(TWAP)、冰山算法(Iceberg)、狙击手算法(Sniper)、条件委托算法(Stop)以及最优限价算法(BestLimit),揭开它们背后的运作机制与实战应用。

木头大左的博客 1886

大彩科技新品首发--新1代HMI人机界面!

该产品是一款7.0寸分辨率为 800*480的M型医用级组态HMI人机界面屏。使用VisualHMI人机界面组态开发平台开发,内部集成了DCBUS、XGUS、Modbus(主/从机)和FX2N(标准/扩展)、FX3U、台达、信捷等协议,可通过VisualHMI一键配置协议;控件上新增配方功能、分期功能、流动块、操作记录表等控件,可以适应更多应用环境。

weixin_43815099的博客 1830

微店构造订单页面,自动化抢票

之前的文章写过微店抢票如何构造订单页面分析,这篇文章在之前的基础上,进行抢票。

猫敷雪 7202

VS2019插件VSIX开发

如何开始? 创建插件项目如下: 当想添加多个插件时,可添加多个,如下: 从一个简单插件项目说起 我创建了一个插件项目,并且添加了三个插件,项目结构如下: A区代表图标资源,一般存放插件的图标,16*16的位图。 B区代表项目中插件的个数,有几个则代表有几个插件,这里有三个。 C区这个文件是项目配置文件,项目中所有插件都在这个文件里面配置,如配置插件的图标,名字,快捷键等。 下面粘贴出C区的配置代码和B区中一个插件的代码。学习插件开发的首先集中注意自己可以修改的代码,因为其中有许多默认部分代码是可以不用

八步赶蝉 6320

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

编程之道在明明德在亲民在止于至善 1972

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Visual Studio 扩展入门(二)HelloWorld 上篇

通过开始第一个程序,了解一个VSPackage开发过程: 一、编写自己的第一个扩展:Hello World 1、新建VSIX项目,并命名为SayHelloWorld![image.png](https://img-blog.csdnimg.cn/img_convert/2b679789ae9465910bc0af40390c4e4a.png#align=left&display=inline&height=344&margin=[object Object]&name=im

starrycraft的博客 859

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Visual Studio 2017项目进行打包并附加.net框架打包,菜鸟级安装教程

一个完整的VisualStudio2017项目进行打包并附加.net框架打包详细过程

qq_42024030的博客 8810

在VS2017中安装Install project

VS中打包安装Winform程序,需要用到setup,需要在工具->扩展和更新->联机中搜索,然后下载。但是我没找到Microsoft Visual Studio Install Project这个工具,使用下面这个链接,可以直接下载这个安装包,下载好后,关闭所有VS2017应用,就可以开始下载安装了。 之后再打开 https://marketplace.visualstudio....

sixforone的博客 3245
上一篇: Accord.Net之HelloWorld(1)
下一篇: 【ABP杂烩】Extensions后缀扩展方法
大龄Giser
博客等级 码龄9年 19粉丝 21原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值