2013-02-19 22 views
7

Ich habe ein paar Beiträge dazu gesehen, aber bisher habe ich keine Lösungen gesehen. Ich habe eine JAR-Datei, die ich über IKVM in eine .NET DLL konvertiere. Ich versuche herauszufinden, wie die Methoden in der DLL in der Excel-VBA-Umgebung verfügbar gemacht werden. Hier sind die Details.Wie mache ich eine .dll erstellt mit IKVM com sichtbar?

1.) installiert IKVM & registriert es DLL zu GAC

2.) lief IKVM die eine .net DLL (mytest.dll erstellen)

ikvmc mytest.jar 

3.) registriert den neuen .dll

regasm mytest.dll 

4.) Von hier aus habe ich ein VB.NET-Projekt und die hinzugefügt mytest.dll und IKVM.OpenJDK.Core.dll als Verweis auf das Projekt. Ich bin dann in der Lage, auf die Methoden innerhalb der .dll in .NET zuzugreifen. Das ist toll!

5.) was ich wirklich tun möchte, ist in der Lage, die .dll in VBA auch zu verwenden. Anfangs akzeptiert VBA die .dll-Datei nicht direkt, da es sich um eine .net-Bibliothek handelt. Ich habe versucht, eine Typenbibliothek zu erstellen:

regasm /codebase /tlb mytest.dll 

Diese eine TLB-Datei erstellt, das ist schön, aber es hat nicht stark benannt wird eine Warnung über die Bibliothek werfen.

6.) dann habe ich die .tlb als Referenz in meinem VBA-Editor geladen. Das funktioniert, aber wenn ich versuche, auf die Methoden zuzugreifen, wird nichts angezeigt. Ähnlich kann ich, wenn ich in der Objektanzeige für meine Bibliothek nachschaue, meine zwei Klassen sehen, aber nicht die Mitglieder dieser Klassen.

Zusätzlich stelle ich mir vor, dass ich wahrscheinlich auch irgendwie die IKVM.OpenJDK.Core.dll in VBA verweisen muss. Das kann ich aber auch nicht, da es sich um eine .NET-DLL handelt.

Hat jemand Erfolg beim Konvertieren einer .jar-Datei in etwas, das mit VBA verwendet werden kann?

Antwort

11

Ich denke, dass Sie immer eine Klasse explizit markieren müssen, um über COM-Interop verwendbar zu sein. Hier ist ein Beispiel für eine Java-Klasse, die verwendbar von VBA ist:

import cli.System.Runtime.InteropServices.*; 

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

Hier sind die Schritte zu kompilieren.

  1. Copy IKVM.Runtime.dll und alle IKVM.OpenJDK * DLL in den. aktuelles Verzeichnis oder der GAC.
  2. Führen Sie "ikvmstub mscorlib" aus, um mscorlib.jar zu generieren.
  3. Erstellen Sie eine Java-Quelle namens SampleWidget.java, die den obigen Code enthält.
  4. javac -cp mscorlib.jar ;. SampleWidget.java
  5. ikvmc -out: SampleLibrary.dll SampleWidget.class -r: mscorlib.dll
  6. TlbExp SampleLibrary.dll
  7. regasm/Code-Basis SampleLibrary.dll (dieser Schritt Administratorrechte benötigt)

Jetzt können Sie einen Verweis auf die SampleLibrary.tlb von VBA hinzufügen und die SampleWidget-Klasse verwenden.

+0

Das hat total funktioniert. Vielen Dank für Ihre Antwort! – user2088580