2011-05-09 120 views
4

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

目的DLL的是运行在C

实现的算法,我应该怎么做?这可能吗?

+0

详细说明确切的情况...... dll的目的是什么? – CoderHawk 2011-05-09 06:34:13

回答

5

你不解释.NET的作用将是在您的方案是什么。您确实可以使用'Declare Function'直接从VBA调用许多C库。

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

从你可以调用,使用P的C .DLL函数NET库/ Invoke的,新增类别,功能和参数的描述融入函数向导等

(声明:我是开发商Excel-DNA)

+0

这正是我正在寻找的。谢谢。 – 2011-05-11 04:57:36

3

你见过这个MSDN article?基本上你从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中导出所需的函数。然后import the DLL functions into VBADeclare声明。

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

一个很简单的例子:

Ç

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 
+0

这也最终成为我的结论,所以我跳过了.Net包装。 – 2011-05-11 04:59:06

+0

那么你为什么接受其他答案? – 2011-05-11 06:00:59

+0

另一个答案回答了我问到的问题。这个答案是我最终做的:)没有冒犯。 – 2011-05-13 08:11:08