从 Excel VBA 调用未注册的 .NET dll

本文关键字:NET dll 注册 Excel VBA 调用 | 更新日期: 2023-09-27 17:55:22

我需要编写一个可以直接从Excel的VBA模块调用的.NET dll,以便dll和.xls简单地部署在同一目录中,而无需任何COM注册。

dll 的目的是运行用 C 实现的算法。

我应该怎么做?这可能吗?

从 Excel VBA 调用未注册的 .NET dll

你没有解释 .NET 在你的方案中的角色是什么。您确实可以使用"声明函数"直接从 VBA 调用许多 C 库。

如果您发现 .NET 很有用,并且想要从 Excel 将 .NET 库函数作为用户定义函数 (UDF) 调用,则可以使用 Excel-DNA。它为您提供了一个 .xll 加载项库,该库将 .NET 库集成到 Excel 中。您仍然需要以某种方式打开 .xll 加载项 - 通过文件 -> 打开,将其添加为 Excel 加载项,或从工作簿中的某个 VBA 自动打开。但它不需要其他注册。

从 .NET 库中,您可以使用 P/Invoke 调用 C .dll函数,添加类别、函数和参数描述以集成到函数向导中等。

(免责声明:我是Excel-DNA的开发者。

你看过这篇 MSDN 文章吗?基本上,您从 DLL 注册函数,而不是 DLL 本身。我不知道文章中是否说得很清楚,但语法是:

[Public | Private] Declare Function name Lib "libname" [Alias "aliasname"] [([arglist])] [As type]

其中"libname"可以包含完整路径,例如"C:''tmp''algo.dll"或仅包含名称,例如"algo.dll"。在第二种情况下,将搜索本地路径以查找匹配的二进制文件。

如果 DLL 包含 C 函数,则应避免使用 .net 和 CLR。 这是不必要的开销。

而是使用 C 编译器(例如 MSVC)来生成 DLL 并从该 DLL 导出所需的函数。 然后使用Declare语句将 DLL 函数导入 VBA。

将 C 函数构建到 DLL 中时,请确保使用 __stdcall 调用约定,因为这是 Declare 的唯一选项。 在生成 DLL 时,可能还需要使用 .def 文件以避免名称修饰。

一个非常简单的例子:

C

int __stdcall add(int a, int b)
{
    return a+b;
}

VBA

Public Declare Function add Lib "mylib.dll" (ByVal a As Long, ByVal b As Long) As Long