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就可以正常使用该类库了。
