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

7
我需要编写一个.NET dll,可以直接从Excel的VBA模块调用,这样dll和.xls文件只需在同一目录下部署,无需进行任何COM注册。
dll的目的是运行使用C实现的算法。
我应该如何进行?这是否可能?

详细阐述确切的情况... DLL 的目的是什么? - Sandeep Kumar M
3个回答

6
您没有解释 .NET 在您的情境中的作用。实际上,您可以使用“Declare Function”直接从 VBA 调用许多 C 库。
如果您发现 .NET 有用,并且想从 Excel 中将您的 .NET 库函数作为自定义函数 (UDFs) 调用,您可以使用 Excel-DNA。它为您提供了一个 .xll 加载项库,将您的 .NET 库集成到 Excel 中。您仍然需要以某种方式打开 .xll 加载项 - 可以通过“文件”->“打开”,将其添加为 Excel 加载项,或者在工作簿中的某些 VBA 中自动打开。但它不需要其他注册。
从 .NET 库中,您可以使用 P/Invoke 调用 C .dll 函数,将类别、函数和参数描述添加到函数向导中等等。
(声明:我是 Excel-DNA 的开发人员。)

4

你看过这篇MSDN文章吗?基本上,你需要注册来自DLL的函数,而不是整个DLL。我不知道文章是否表述得非常清楚,但语法如下:

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

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


3
如果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

那也是我的结论,所以我跳过了 .Net 封装器。 - Christian Madsen
另一个答案回答了我所问的问题。这个答案就是我最终采取的方法 :) 没有冒犯之意。 - Christian Madsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接