2010-11-17 11 views
7

Ich habe meine eigene .Net Code auszuführen erfolgreich in der Lage gewesen, indem Sie die SchritteVerwendung von Standard-.NET-Bibliotheken mit VBA

Gibt es eine Möglichkeit, die Standard-.NET-Bibliotheken zu verwenden, ohne einen Wrapper hier Execute .NET 3.0 code from Office 2003 geschrieben schreiben ? Auf diese Weise können Sie die Registrierung und Installation einer benutzerdefinierten DLL in der GAC auf dem Clientcomputer vermeiden.

Ich habe Tlb-Dateien bereits in den Ordnern C: \ Windows \ Microsof.NET \ Framework gefunden und konnte einen Verweis auf mscorlib.dll hinzufügen. Betrachtet man die Dokumentation für RijndaelManaged, scheint diese Klasse COM sichtbar zu sein.

Ich bin in der Lage, eine Instanz zu erstellen, aber sobald ich versuche und damit arbeite, erhalte ich Fehler (z. B. "Typ nicht übereinstimmen").

Sub Macro1() 
    Dim aesImplementation As New RijndaelManaged 

    Set key = aesImplementation.GenerateKey() 
    Set iv = aesImplementation.GenerateIV() 
End Sub 

Ich bin bereit, alle Hacks zu akzeptieren, die Sie anbieten müssen!

+2

ich keine Antwort re haben: verwenden. NET ohne einen Wrapper, aber wenn Sie neu in VBA sind, müssen Sie wissen, dass das Deklarieren von etwas wie "As New" zu diesem Zeitpunkt tatsächlich nichts instanziiert, wie in .NET. Es ist mir nicht klar, ob Ihr Fehler bei der Instanziierung oder beim 'Set' auftritt. (Ich gehe davon aus, dass Sie Ihre Schlüsselvariable als korrekten Typ deklariert haben, usw.). Siehe http://stackoverflow.com/questions/2478097/vba-difference-in-two-ways-of-declaring-a -new-object-trying-to-verstehen-why/2480559 # 2480559 – jtolle

+0

Das ist verrückt Warum haben Sie eine gültige Syntax, wenn sie kein neues Objekt instanziiert ?! Es scheint jedoch in diesem Fall eine Instanz zu schaffen, ich werde mich zumindest daran erinnern, dass "als neu" nicht die beste Vorgehensweise ist. Der Grund, warum ich das Schlüsselobjekt nicht explizit deklariert habe, ist, weil ich bekomme "Kann nicht zum Array zuweisen" -Fehler, wenn ich das tue. Anscheinend tritt dieser Fehler auf, wenn Sie versuchen, einem Array eines anderen Typs zuzuweisen. –

+1

Ist das nicht viel Arbeit, um nur etwas Arbeit zu sparen? Ich meine, wenn Ihr Benutzer Ihnen erlaubt, ein Makro auszuführen, warum nicht eine tatsächliche .NET-Anwendung ausführen? Das Office-Interop in .NET scheint ziemlich gut zu sein, also könnten Sie Dokumente gleich oder besser manipulieren! –

Antwort

1

Noch nicht möglich. VBA (VB for Applications) ist nicht VB, sondern ein separater Deal, der die grundlegende Syntax wie ältere Versionen von VB nachahmt. Es ist fast so, als würde man eine sehr abgespeckte Version von regulären, älteren VB verwenden. In der Tat ist VBScript die beste Übereinstimmung mit VBA. Vielleicht wird Microsoft eines Tages Methoden einbauen, um direkt mit dem GAC zu arbeiten, aber bis dahin (und dieser Tag wird wahrscheinlich den Tod von COM bedeuten, bin ich mir sicher), stecken Sie mit der Methode COM CreateObject() fest und fügen einen Verweis auf eine COM hinzu registrierte Bibliothek in Ihrem Office-Projekt oder verweisen Sie direkt auf eine VBA/COM-kompatible DLL- oder TLB-Datei in Ihrem Office-Projekt.

Es gibt ziemlich viele COM-fähige Bibliotheken in der Standard-GAC, aber für die Mehrheit, stecken Sie fest, Erstellen einer Com Callable Wrapper zuerst in VB.Net oder C#.

Im Gegensatz dazu sind so ziemlich alle MS Office-Anwendungen COM aufrufbar, so dass Sie mit installierten Office-Anwendungen über VB.Net-Projekte arbeiten können, was Sie wollen.

+3

Durch Hinzufügen eines Verweises auf 'mscorlib.dll' können Sie ein Objekt einer beliebigen Klasse mit einem parameterlosen öffentlichen Konstruktor in den Standard-.net-Bibliotheken erstellen. Sie werden dies sehr einschränkend finden. – AndASM

+1

"VBScript ist die beste Übereinstimmung zu VBA" - VBA ist * sehr viel näher an klassischen VB6 als an VBScript: https://msdn.microsoft.com/en-us/library/ms970436.aspx – Joe

1

Sie sollten ComVisible .NET-Klassen auf diese Weise verwenden können. Die Methoden GenerateKey und GenerateIV haben jedoch keinen Rückgabewert. Versuchen:

Sub Macro1() 
    Dim aesImplementation As New RijndaelManaged 

    aesImplementation.GenerateKey 
    Key = aesImplementation.Key 
    aesImplementation.GenerateIV 
    IV = aesImplementation.IV 
End Sub 

oder besser, nicht zuletzt, weil beim Debuggen können Sie sehen, ob ein Fehler bei der Konstruktion auftritt oder wenn Sie die Methode aufrufen:

Sub Macro1() 
    Dim aesImplementation As RijndaelManaged 
    Set aesImplementation = New RijndaelManaged 

    aesImplementation.GenerateKey 
    Key = aesImplementation.Key 
    aesImplementation.GenerateIV 
    IV = aesImplementation.IV 
End Sub 
Verwandte Themen