2011-05-09 121 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