C# 创建vba用的类库
一. 需求
🔷写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类库注册到系统
🔷篇幅较长,不在此篇文章展开,详情请参考下面这篇文章。
六. vba中使用
🔷当.dll类库注册到系统之后,vba就可以正常使用该类库了。

到此这篇关于C# 创建vba用的类库的文章就介绍到这了,更多相关C# 创建vba类库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
C#中泛型容器Stack<T>的用法并实现”撤销/重做”功能
这篇文章介绍了C#中泛型容器Stack<T>的用法并实现”撤销/重做”功能,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-10-10
C#使用foreach遍历哈希表(hashtable)的方法
这篇文章主要介绍了C#使用foreach遍历哈希表(hashtable)的方法,是C#中foreach语句遍历散列表的典型应用,非常具有实用价值,需要的朋友可以参考下2015-04-04


最新评论