2013-02-19 12 views
7

Ho visto alcuni post su questo, ma non ho visto nessuna soluzione finora. Ho un file .jar che sto convertendo in una DLL .NET tramite IKVM. Sto cercando di capire come rendere i metodi nella DLL disponibili all'interno dell'ambiente Excel VBA. ecco i dettagliCome faccio a rendere visibile un file .dll creato con IKVM com?

1.) installato IKVM & registrata è DLL di GAC

2.) corse IKVM per creare l'una .net .dll (MyTest.dll)

ikvmc mytest.jar 

3.) ha registrato il nuovo .dll

regasm mytest.dll 

4.) Da qui ho creato un progetto VB.NET e ha aggiunto MyTest.dll e IKVM.OpenJDK.Core.dll come riferimenti al progetto. Sono quindi in grado di accedere ai metodi all'interno di .dll in .NET. È fantastico!

5.) Quello che voglio veramente fare è poter usare anche il file .dll in VBA. Inizialmente vba non accetta la .dll direttamente poichè è una libreria .net. Ho cercato di creare una libreria di tipi:

regasm /codebase /tlb mytest.dll 

Questo ha creato un file TLB che è bello, ma lo ha fatto lanciare un avvertimento circa la libreria non essendo fortemente nominato.

6.) quindi ho caricato il .tlb come riferimento nel mio editor di vba. Funziona, tuttavia quando provo ad accedere ai metodi non compare nulla. Allo stesso modo se guardo il visualizzatore di oggetti per la mia libreria posso vedere le mie due classi ma non i membri di quelle classi.

Inoltre, immagino che probabilmente ho anche bisogno di fare riferimento in qualche modo all'IKVM.OpenJDK.Core.dll all'interno di VBA. Tuttavia non posso farlo perché è un .dll .NET.

Qualcuno ha avuto successo nella conversione di un file .jar in qualcosa che può essere utilizzato con VBA?

risposta

11

Penso che sia sempre necessario contrassegnare esplicitamente una classe per essere utilizzabile tramite l'interoperabilità COM. Ecco un esempio di una classe Java che è utilizzabile da VBA:

import cli.System.Runtime.InteropServices.*; 

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

qui sono i passi per compilare:.

  1. Copia IKVM.Runtime.dll e tutto IKVM.OpenJDK * DLL nella. directory corrente o GAC.
  2. Eseguire "ikvmstub mscorlib" per generare mscorlib.jar.
  3. Creare un codice sorgente Java denominato SampleWidget.java contenente il codice sopra.
  4. javac -cp mscorlib.jar ;. SampleWidget.java
  5. ikvmc out privati: SampleLibrary.dll SampleWidget.class -r: mscorlib.dll
  6. TlbExp SampleLibrary.dll
  7. regasm/codebase SampleLibrary.dll (questo passaggio ha bisogno di diritti di amministratore)

Ora è possibile aggiungere un riferimento a SampleLibrary.tlb da VBA e utilizzare la classe SampleWidget.

+0

Questo ha funzionato completamente. Grazie mille per la tua risposta! – user2088580