C# 创建vba用的类库

目录

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

一. 需求

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

vbnet 复制代码
Sub SendGetRequest()

    Const url = "https://api.github.com"

    ' 创建http请求对象
    Dim http As Object
    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")

    ' 发送get请求
    http.Open "GET", url, False
    http.Send

    Debug.Print http.ResponseText

End Sub

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

vbnet 复制代码
Sub MainSub()

    Dim obj As Object
    Set obj = CreateObject("ToolLib.ToolCom")

    MsgBox obj.Hello("World")
    MsgBox obj.Add(3, 5)

End Sub

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

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

二. 初始化项目

🔷创建一个类库

csharp 复制代码
dotnet new classlib -n ToolLib

🔷修改.csproj文件如下所示

csharp 复制代码
<Project Sdk="Microsoft.NET.Sdk">

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

</Project>

三. 项目代码

3.1 Tool.cs主类

🔷Tool.cs

  • [ComVisible(true)]:设置Com可见, 否则vba无法使用
  • [Guid("xxxxx-xxxx-xxxx-xxxxxxx")]:类库的唯一标识符,可以使用 Visual Studio 生成。
csharp 复制代码
using System.Runtime.InteropServices;

namespace ToolLib
{
	[ComVisible(true)]
	[Guid("1D4C98EC-D988-4D6C-8DD6-189E238D7B4E")]
	[InterfaceType(ComInterfaceType.InterfaceIsDual)]
	public interface IToolCom
	{
		int Add(int a, int b);
		string Hello(string name);

	}

	[ComVisible(true)]
	[Guid("6143FB0B-9C17-4859-860C-6DA4A466ECD1")]
	// 显示声明ProgId, 便于vba通过 CreateObject("ToolLib.ToolCom") 创建对象
	[ProgId("ToolLib.ToolCom")]
	[ClassInterface(ClassInterfaceType.None)]
	public class ToolCom : IToolCom
	{
		public int Add(int a, int b)
		{
			return a + b;
		}

		public string Hello(string name)
		{
			return $"Hello, {name}";
		}
	}
}

🔷生成GUID的方法

3.2 AssemblyInfo.cs配置类

csharp 复制代码
using System.Reflection;
using System.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就可以正常使用该类库了。

相关推荐
泛凡(Linyongui)14 小时前
基于 CW32L010 的智能厨卫调温旋钮方案--低成本 EC21 编码旋钮全解析
单片机·嵌入式硬件·c#
暴走约伯16 小时前
【VFX工具链源码拆解 02】告别机械劳动(上):一键统改百个子粒子颜色与批量重命名
3d·unity·c#·材质
信息安全失业大专人员17 小时前
每日了解一个智能体-WorkBuddy
开发语言·ai·c#·智能体
呆呆敲代码的小Y18 小时前
【实战精选面试题】C# 面试题详细解答,按难易程度排序
android·java·游戏·c#·游戏开发·unity面试题·c#面试题
淡海水19 小时前
09-01-内存-Unity资源生命周期全景
unity·c#·游戏引擎·.netcore·gc
椒颜皮皮虾྅1 天前
让 C# 读懂整张图:DeploySharp 驱动 PaddleOCR v4/v5/v6,打通 OCR 全流程
开发语言·人工智能·深度学习·学习·c#·ocr·cuda
昂好的day1 天前
C# 同步异步与多线程:Thread / Task / 线程池一次讲透(上篇)
开发语言·windows·c#
吃一碗粉只付一碗钱1 天前
12-给SPA友好的401和403响应
c#·状态模式
caimouse2 天前
MonoDevelop 编译用户应用程序时调用的是哪个编译器
c#
will_net2 天前
apollo 站点部署&C#接入
开发语言·c#·apollo