2013-02-19 69 views
7

我已經看到了一些這方面的帖子,但到目前爲止我還沒有看到任何解決方案。我有一個.jar文件,我通過IKVM轉換爲.NET DLL。我試圖找出如何使Excel中的方法在Excel VBA環境中可用。這裏是細節。如何使用IKVM com創建的.dll可見?

1)安裝IKVM &註冊它的DLL對GAC

2)跑IKVM創建一個.NET .dll文件(mytest.dll)

ikvmc mytest.jar 

3)註冊新.DLL

regasm mytest.dll 

4)在這裏,我創建了一個VB.NET工程並添加mytest.dll和IKVM.OpenJDK.Core.dll爲項目引用。然後,我可以訪問.NET中.dll中的方法。這很棒!

5.)我真正想要做的是能夠在VBA中使用.dll。最初,vba不會直接接受.dll,因爲它是一個.net庫。我試圖創建一個類型庫:

regasm /codebase /tlb mytest.dll 

這創造了一個.tlb文件,這是很好的,但它確實拋出一個關於未強命名庫警告。

6.)然後我在我的vba編輯器中加載.tlb作爲參考。這有效,但是當我嘗試訪問這些方法時,什麼都沒有顯示出來。同樣,如果我查看我的庫的對象查看器,我可以看到我的兩個類,但不能看到這些類的成員。

此外,我想我可能還需要以某種方式引用VBA內的IKVM.OpenJDK.Core.dll。但是,我不能這樣做,因爲它是一個.NET .dll。

有沒有人成功將.jar文件轉換爲可與VBA一起使用的東西?

回答

11

我認爲你總是需要明確地標記一個類可以通過COM interop來使用。下面是一個Java類的一個例子是使用從VBA:

import cli.System.Runtime.InteropServices.*; 

@ClassInterfaceAttribute.Annotation(ClassInterfaceType.__Enum.AutoDual) 
public class SampleWidget { 
    public int Add(int x, int y) { 
    return x + y; 
    } 
} 

以下是編譯步驟:

  1. 複製IKVM.Runtime.dll和所有IKVM.OpenJDK * DLL注入的。當前目錄或GAC。
  2. 運行「ikvmstub mscorlib」生成mscorlib.jar。
  3. 創建一個名爲SampleWidget.java的Java源代碼,其中包含上面的代碼。
  4. javac -cp mscorlib.jar ;. SampleWidget.java
  5. ikvmc退房手續:SampleLibrary.dll SampleWidget.class -r:mscorlib.dll中
  6. tlbexp SampleLibrary.dll
  7. regasm /基本代碼SampleLibrary.dll(這一步需要管理員權限)

現在您可以從VBA添加對SampleLibrary.tlb的引用並使用SampleWidget類。

+0

這完全工作。非常感謝您的回覆! – user2088580 2013-02-20 16:19:18