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

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

dll的目的是运行在C中实现的algorithm

我应该如何继续? 这可能吗?

你不能解释.NET在你的场景中的作用。 您确实可以使用“Declare Function”直接从VBA调用许多C库。

如果你觉得.NET很有用,并且想从.NET中调用.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”可以包含完整path,例如“C:\ tmp \ algo.dll”或只有一个名称,例如“algo.dll”。 在第二种情况下,本地path将search匹配的二进制文件。

如果DLL包含C函数,那么你应该避免.net和CLR。 这是一个不必要的开销。

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

当您将C函数构build到DLL中时,请确保使用__stdcall调用约定,因为这是Declare的唯一选项。 构buildDLL时可能还需要使用.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