VSTO自动更新部署方案
dll部署
ClickOnce部署很方便,但是没有版本倒退的功能。在实际的项目中,插件版本往往和数据版本有关联的,切换到指定的svn或git版本,希望也能有对应版本的插件功能。
以svn版本控制为例,说明怎么使用dll部署。
插件本体项目
仍然采用ClickOnce部署的方式,不过可以不填远程Url,因为不存在插件更新的情况;界面及功能采用Dll的方式书写
Dll项目创建
创建一个Net Framework类库
引入相关引用;将正常的VSTO项目中的引用都添加进来
创建绘制的函数(从VSTO设计器产生的函数直接复制过来就行)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Office.Tools.Ribbon;
namespace ClassLibrary1
{
public static class Class1
{
/// <summary>
/// 绘制tab,返回提供给VSTO使用
/// </summary>
/// <param name="factory"></param>
/// <returns></returns>
public static RibbonTab DrawTab(RibbonFactory factory)
{
RibbonTab tab1 = factory.CreateRibbonTab();
RibbonGroup group1 = factory.CreateRibbonGroup();
tab1.SuspendLayout();
tab1.ControlId.ControlIdType = Microsoft.Office.Tools.Ribbon.RibbonControlIdType.Office;
tab1.Groups.Add(group1);
tab1.Label = "TabAddIns";
tab1.Name = "tab1";
group1.Label = "group1";
group1.Name = "group1";
tab1.ResumeLayout(false);
tab1.PerformLayout();
return tab1;
}
}
}
VSTO项目中的功能区代码略作调整
设计器产生代码
修改前
private void InitializeComponent()
{
this.tab1 = this.Factory.CreateRibbonTab();
this.group1 = this.Factory.CreateRibbonGroup();
this.tab1.SuspendLayout();
this.SuspendLayout();
//
// tab1
//
this.tab1.ControlId.ControlIdType = Microsoft.Office.Tools.Ribbon.RibbonControlIdType.Office;
this.tab1.Groups.Add(this.group1);
this.tab1.Label = "TabAddIns";
this.tab1.Name = "tab1";
//
// group1
//
this.group1.Label = "group1";
this.group1.Name = "group1";
//
// Ribbon1
//
this.Name = "Ribbon1";
this.RibbonType = "Microsoft.Excel.Workbook";
this.Tabs.Add(this.tab1);
this.Load += new Microsoft.Office.Tools.Ribbon.RibbonUIEventHandler(this.Ribbon1_Load);
this.tab1.ResumeLayout(false);
this.tab1.PerformLayout();
this.ResumeLayout(false);
}
修改后
private void InitializeComponent()
{
this.SuspendLayout();
// 根据dll获取函数,产生tab
Assembly assembly = Assembly.LoadFrom("XXX/test.dll");
Type type = assembly.GetType("ClassLibrary1.Class1");
MethodInfo methodInfo = type.GetMethod("DrawTab",
BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static
);
this.tab1 = (RibbonTab)methodInfo.Invoke(null, new[] { this.Factory });
this.Name = "Ribbon1";
this.RibbonType = "Microsoft.Excel.Workbook";
this.Tabs.Add(this.tab1);
this.ResumeLayout(false);
}
这样在打开插件之后,会根据dll自动获取绘制函数,从而实现根据dll的内容更新插件。
问题
不同用户,机子上dll的路径可能不同,怎么获取?
可以要求用户首次使用的时候,执行一个.bat
,让用户输入自己的svn项目路径,然后根据svn路径和相对路径,拼出来dll的路径。
ClickOnce部署
该方案使用了一个文件服务器用来访问部署文件。(后以www.example.com/Files作为示例地址)
使用VS模板,创建一个Excel AddIn项目(在其中填充你想要的功能,此处略过不提)
右键项目,打开属性界面
选中发布页签,进行设置并点击发布
发布后的文件复制到文件服务器的目录下即可
用户从对应URL下载Setup.exe进行安装即可;后续也会自动从对应URL拉取更新的
问题
如果出现从不信任的位置或来源安装的报错,导致无法进行安装,可以直接采用信任证书的方式安装
右键下载下来的Setup.exe,找到证书进行安装
原因:发布的软件都有证书,在属性界面的签名页签里进行设置。默认使用的是测试证书,用户机器不信任。需要手动安装信任下才可以正常。
后续不更改证书,就不用重新信任了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!