C# 创建vba用的类库

张开发
2026/6/9 18:29:33 15 分钟阅读
C# 创建vba用的类库
目录一. 需求二. 初始化项目三. 项目代码3.1 Tool.cs主类3.2 AssemblyInfo.cs配置类四. 编译五. 将.dll类库注册到系统六. vba中使用一. 需求写vba代码的时候会想下面这样使用CreateObject创建一个对象然后使用其中的方法SubSendGetRequest()Consturlhttps://api.github.com 创建http请求对象DimhttpAsObjectSethttpCreateObject(WinHttp.WinHttpRequest.5.1) 发送get请求http.OpenGET,url,Falsehttp.SendDebug.Printhttp.ResponseTextEndSub先要求在vba中使用CreateObject(ToolLib.ToolCom)创建一个对象然后使用其中的方式。SubMainSub()DimobjAsObjectSetobjCreateObject(ToolLib.ToolCom)MsgBox obj.Hello(World)MsgBox obj.Add(3,5)EndSub用C#写一个能被VBA调用的COM组件把.NET类暴露成COM可见对象。C#写类标记为COM可见编译成DLL注册到系统regasmVBA 通过CreateObject调用二. 初始化项目创建一个类库dotnetnewclasslib-n ToolLib修改.csproj文件如下所示ProjectSdkMicrosoft.NET.SdkPropertyGroup!--推荐用.NET Framework--TargetFrameworknet48/TargetFramework!--关闭自动注册--RegisterForComInteropfalse/RegisterForComInterop!--关闭自动生成AssemblyInfo--GenerateAssemblyInfofalse/GenerateAssemblyInfo!--不输出调试信息--DebugTypenone/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){returnab;}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就可以正常使用该类库了。

更多文章