news 2026/4/20 22:00:15

C# 创建vba用的类库

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C# 创建vba用的类库

目录

  • 一. 需求
  • 二. 初始化项目
  • 三. 项目代码
    • 3.1 `Tool.cs`主类
    • 3.2 `AssemblyInfo.cs`配置类
  • 四. 编译
  • 五. 将`.dll`类库注册到系统
  • 六. vba中使用

一. 需求

🔷写vba代码的时候,会想下面这样使用CreateObject创建一个对象,然后使用其中的方法

SubSendGetRequest()Consturl="https://api.github.com"' 创建http请求对象DimhttpAsObjectSethttp=CreateObject("WinHttp.WinHttpRequest.5.1")' 发送get请求http.Open"GET",url,Falsehttp.SendDebug.Printhttp.ResponseTextEndSub

🔷先要求在vba中使用CreateObject("ToolLib.ToolCom")创建一个对象,然后使用其中的方式。

SubMainSub()DimobjAsObjectSetobj=CreateObject("ToolLib.ToolCom")MsgBox obj.Hello("World")MsgBox obj.Add(3,5)EndSub

🔷用C#写一个能被VBA调用的COM组件,把.NET类暴露成COM可见对象。

  • C#写类
  • 标记为COM可见
  • 编译成DLL
  • 注册到系统(regasm)
  • VBA 通过CreateObject调用

二. 初始化项目

🔷创建一个类库

dotnetnewclasslib-n ToolLib

🔷修改.csproj文件如下所示

<ProjectSdk="Microsoft.NET.Sdk"><PropertyGroup><!--推荐用.NET Framework--><TargetFramework>net48</TargetFramework><!--关闭自动注册--><RegisterForComInterop>false</RegisterForComInterop><!--关闭自动生成AssemblyInfo--><GenerateAssemblyInfo>false</GenerateAssemblyInfo><!--不输出调试信息--><DebugType>none</DebugType></PropertyGroup></Project>

三. 项目代码

3.1Tool.cs主类

🔷Tool.cs

  • [ComVisible(true)]:设置Com可见, 否则vba无法使用
  • [Guid("xxxxx-xxxx-xxxx-xxxxxxx")]:类库的唯一标识符,可以使用 Visual Studio 生成。
usingSystem.Runtime.InteropServices;namespaceToolLib{[ComVisible(true)][Guid("1D4C98EC-D988-4D6C-8DD6-189E238D7B4E")][InterfaceType(ComInterfaceType.InterfaceIsDual)]publicinterfaceIToolCom{intAdd(inta,intb);stringHello(stringname);}[ComVisible(true)][Guid("6143FB0B-9C17-4859-860C-6DA4A466ECD1")]// 显示声明ProgId, 便于vba通过 CreateObject("ToolLib.ToolCom") 创建对象[ProgId("ToolLib.ToolCom")][ClassInterface(ClassInterfaceType.None)]publicclassToolCom:IToolCom{publicintAdd(inta,intb){returna+b;}publicstringHello(stringname){return$"Hello,{name}";}}}

🔷生成GUID的方法

3.2AssemblyInfo.cs配置类

usingSystem.Reflection;usingSystem.Runtime.InteropServices;// 文件→属性→详细信息→文件说明[assembly:AssemblyTitle("ToolLib_Test")]// vba→工具→引用 时显示的信息[assembly:AssemblyDescription("FengYeHong VBA COM Library")][assembly:AssemblyCompany("FengYeHong-Company")]// 文件→属性→详细信息→产品名称[assembly:AssemblyProduct("ToolLib_for_vba")]// 非常重要// 类型库 GUID[assembly:Guid("9F3E7D2C-1234-4A56-8888-ABCDEF123456")]// 文件→属性→详细信息→产品版本[assembly:AssemblyVersion("1.0.0.1")]


四. 编译

🔷该工程要生成的是一个类库,因此需要通过编译生成所需的.dll文件


五. 将.dll类库注册到系统

🔷篇幅较长,不在此篇文章展开,详情请参考下面这篇文章。

Powershell 注册.dll类库到系统


六. vba中使用

🔷当.dll类库注册到系统之后,vba就可以正常使用该类库了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 21:59:22

嵌入式BI革命:SaaS/ISV厂商如何用衡石科技快速上线数据分析能力

导语&#xff1a; 客户要求产品内置数据分析功能&#xff0c;但自研成本高、周期长。衡石科技的嵌入式BI解决方案&#xff0c;让SaaS厂商最快两周内就能交付专业级数据分析能力&#xff0c;并将客户活跃度提升40%以上。一、SaaS厂商的共同焦虑在客户数字化需求日益升级的今天&a…

作者头像 李华
网站建设 2026/4/20 21:55:54

后端接口防重放攻击与数据加密

在数字化时代&#xff0c;后端接口的安全性成为系统设计的核心问题。防重放攻击与数据加密是保障接口安全的两大关键技术&#xff0c;前者防止恶意请求被重复提交&#xff0c;后者确保传输数据不被窃取或篡改。本文将深入探讨如何通过技术手段实现接口的高安全性&#xff0c;为…

作者头像 李华
网站建设 2026/4/20 21:55:13

CodeCombat如何用游戏化编程破解300万学生的编程学习难题?

CodeCombat如何用游戏化编程破解300万学生的编程学习难题&#xff1f; 【免费下载链接】codecombat Game for learning how to code. 项目地址: https://gitcode.com/gh_mirrors/co/codecombat 在数字化时代&#xff0c;编程已成为21世纪的核心素养&#xff0c;但传统的…

作者头像 李华
网站建设 2026/4/20 21:47:13

PTP协议精讲(2.12):PTP的十种语言——报文格式全解析

2.12 PTP的十种语言&#xff1a;报文格式全解析 如果PTP报文会说话 想象PTP报文是"信使"&#xff0c;在网络中穿梭。 它们携带不同的"信件"&#xff1a; Sync&#xff1a;“主时钟说&#xff0c;现在是10:00:00.000000000秒”Announce&#xff1a;“我…

作者头像 李华