C# 创建vba用的类库

 更新时间:2026年04月22日 10:14:12   作者:fengyehongWorld  
本文详细介绍了如何在VBA中使用C#编写的COM组件,首先创建一个C#项目,定义ComVisible特性和生成GUID,然后修改.csproj文件并编译生成.dll文件,之后将该.dll文件注册到系统,最后在VBA代码中使用CreateObject方法创建该对象并调用其方法

一. 需求

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

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")创建一个对象,然后使用其中的方式。

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调用

二. 初始化项目

🔷创建一个类库

dotnet new classlib -n ToolLib

🔷修改.csproj文件如下所示

<Project Sdk="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 生成。
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.2AssemblyInfo.cs配置类

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

到此这篇关于C# 创建vba用的类库的文章就介绍到这了,更多相关C# 创建vba类库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#实现XML序列化与反序列化

    C#实现XML序列化与反序列化

    这篇文章介绍了C#实现XML序列化与反序列化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • c#后台线程访问前台控件并显示信息示例

    c#后台线程访问前台控件并显示信息示例

    这篇文章主要介绍了c#后台线程访问前台控件并显示信息示例,需要的朋友可以参考下
    2014-03-03
  • C#交错数组浅析

    C#交错数组浅析

    这里介绍C#交错数组,数组是具有同一类型的一组值,数组是引用类型的,因此存在内存堆中。数组中的元素值可以在定义数组时赋予,也可以在定义数组后对单个元素进行赋值
    2012-09-09
  • C#实现程序最小化后重新拉起并强制置顶显示的技术指南

    C#实现程序最小化后重新拉起并强制置顶显示的技术指南

    本文详细讲解了程序在最小化后重新拉起的并置顶的实现方法,首先分析了该场景与普通重启的不同之处,接着阐述了单实例检测的方法、窗口状态恢复的技术路径、突破前台限制的核心思路,需要的朋友可以参考下
    2026-05-05
  • C# System.Text.Encoding使用小结

    C# System.Text.Encoding使用小结

    System.Text.Encoding类及其派生类提供了丰富的功能,帮助开发者实现不同字符编码之间的转换,本文就来介绍一下C# System.Text.Encoding使用,感兴趣的可以了解一下
    2025-07-07
  • C# Razor语法规则

    C# Razor语法规则

    这篇文章介绍了C# Razor的语法规则,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • C#实现Markdown内容转为Word或PDF

    C#实现Markdown内容转为Word或PDF

    Markdown作为一种轻量级的标记语言,因其简洁易读、语法清晰的特点被广大程序员和技术文档编写者所青睐,本文主要介绍了如何使用C#实现Markdown内容转为Word或PDF,需要的可以参考下
    2024-03-03
  • Unity中的PostProcessScene实用案例深入解析

    Unity中的PostProcessScene实用案例深入解析

    这篇文章主要为大家介绍了Unity中的PostProcessScene实用案例深入解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • c# wpf使用GMap.NET类库,实现地图轨迹回放

    c# wpf使用GMap.NET类库,实现地图轨迹回放

    这篇文章主要介绍了c# wpf使用GMap.NET类库,实现地图轨迹回放的方法,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • 在WinForm中发送HTTP请求的实现方法

    在WinForm中发送HTTP请求的实现方法

    下面小编就为大家带来一篇在WinForm中发送HTTP请求的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06

最新评论