Announcement

Collapse
No announcement yet.

.Net Com tbl-Datei in eine Net-Anwendung dynamisch importieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • .Net Com tbl-Datei in eine Net-Anwendung dynamisch importieren

    Guten Tag Community

    Ich hab von meinen Kunden eine Tlb-Datei bekommen (mehr eben nicht), die ich nun in einer Net-Anwendung dynamisch einbinden soll.

    Ich hab schon gesucht und auch probiert. Nun gefunden habe ich viel, nur funktionieren tut es nicht. Aus diesem Grunde habe ich mir jetzt eine eigene tlb-Datei erstellt die folgendermassen aussieht. Hab Sie Com-tauglich gemacht und registriert und nachher in Excel getestet und sie funktioniert einwandfrei.

    [highlight=vbnet]
    Option Explicit On
    Option Strict On
    Imports System.Runtime.InteropServices

    Public Class cIntFunction
    Public Function CreateIntArray() As Integer(,)
    Dim intArray(,) As Integer
    Dim rnd As New Random
    ReDim intArray(9, 9)
    CreateIntArray = Nothing

    For i As Integer = 0 To 9
    For j As Integer = 0 To 9
    intArray(i, j) = rnd.Next(10, 100) '10 - 99
    Next
    Next
    Return intArray
    End Function
    Public Function XHochY(ByVal intX As Integer, ByVal intY As Integer) As Integer
    Return CInt(intX ^ intY)
    End Function
    Public Function sGetAnswer() As String
    Return "Hallo from .Net Com"
    End Function
    Public Sub New()
    MyBase.New()
    End Sub
    End Class
    [/highlight]


    Nun wollte ich die frisch erstellte tlb in einer Net-Anwendung importieren. Dies habe ich mit einer DllImport-Anweisung schon versucht, funktioniert aber nicht. Unter Verweise kann ich die tbl-Datei auch nicht einbinden da sie bekanntlicherweise (NativeCode) nicht so akzeptiert wird von VB.Net. Die von VB.Net erstellte Dll will ich ja nicht benutzen, da ich vom Kunden nur eine tbl-Datei gekriegt habe.

    Hat mir jemand einen Tip, wie ich eine solche Datei dynamisch einbinden kann? Geht das überhaupt? Arbeite mit VB.Net 2010 Express, Vista-32.

    Danke für die Antwort

    Freundliche Grüsse

    exc-jdbi
    Attached Files

  • #2
    Die tlb Datei im System registrieren und über den COM Reiter in Verweise auswählen.

    Comment


    • #3
      tlb, Com-Interop, dynamisch einbeziehen

      Guten Tag Ralf Jansen

      Danke für die Antwort. Genau diesen Weg habe ich schon versucht. Aber ich kriege immer wieder die Fehlermerldung, dass es sich um eine falsche Art der Dll handle, wie das bei den native-Dll der Fall ist. Ich finden zwar die entsprechende Datei im COM-Reiter, aber ich kann sie nicht übernehmen.

      Darum habe ich den Versuch unternommen über eine dllImport-Anweisung die tlb-Datei einzubeziehen, was mir für den dynamischen Prozess sowieso viel eher Sinn macht. Ich werde heute abend sicher noch kurz Zeit finden, dass nochmals anzuschauen. Aber vielleicht hat jemand anders noch einen guten Tip.

      Danke für die Bemühungen.

      Freundliche Grüsse

      exc-jdbi

      Comment


      • #4
        dllImport hilft dir nur bei dlls mit klassischen C Exporten, wie zum Beispiel bei der Win API, du willst aber was mit COM machen. Was du bei DllImport für dynamisch hältst ist mir schleierhaft. Du musst zur Designzeit Quelle und Signatur der Methode angeben. Da sehe ich haargenau 0 Dynamik.

        Wenn du es dynamisch oder was du eher eher meins spät gebunden (late binding) möchest kannst du dir einfach per Activator.CreateInstance eine entsprechende Proxyklasse erzeugen. Etwa so


        [Highlight=C#]Guid clsid = new Guid("4E898AFE-4488-400D-AAF4-CDE3BC8E665A"); // hier die Guid deiner gewünschten Schnittstelle eintragen
        string serverName = "deinLieberServerName";


        Type type = Type.GetTypeFromCLSID(clsid, serverName, true);
        dynamic intf = Activator.CreateInstance(type);


        intf.MeineLiebeMethode();

        [/Highlight]

        Comment


        • #5
          tlb, com-interop

          Guten Abend Ralf Jansen

          Also ohne das ich hier und jetzt ironisch wirken will, aber da ist mir wohl in der Ausdrucksweise meine Affinität zur Physik durchgegangen ... Ich befasse mich tatsächlich noch nicht so lange mit den Begriffen early und late, und ja ... wir können sagen, wir haben auch schon richtig Streit bekommen.

          Warum ich das dynamisch sehe? Meine Idee dazu war es die tlb-Datei zu einem späteren Zeitpunkt einzubinden, und nach "getaner Arbeit" wieder zu entladen. Da dieser Prozess während der Laufzeit stattfindet, sehe ich den Bindungsprozess als dynamisch. Ist vielleicht auch Geschmackssache.

          Ich weiss noch nicht genau, was wirklich alles zu diesem Thema möglich ist, aber ich arbeite ja daran ... Ich hoffe das ich da niemandem auf die Füsse getreten bin. (((o: ...


          Danke für den Tip, ich werde es heute abend noch anschauen.


          Freundliche Grüsse


          exc-jdbi

          Comment


          • #6
            Eine tlb ist nur eine Schnittstellen Beschreibung gegen die du Programmieren kannst. Wenn du die benutzt kannst du typsicher Programmieren heißt der Compiler kann dir schon beim Compilieren sagen da ist was faul. Wenn du erst zur Laufzeit weißt was und wohin dann ist die tlb irgendwie überflüssig du kannst eh gegen nix konkretes Programmieren und es wird erst zur Laufzeit knallen wenn du was falsch machst. Dann kannst du die tlb auch gleich vergessen und einfach späte Bindung verwenden wie von mir gezeigt (und hoffen das das zur Laufzeit auch korrekt ist).

            Vorzuziehen ist aber der erste Weg (wegen der Typsicherheit). Der macht aber nur Sinn wenn du dir auch eine Interop Dll generieren kannst. Hätte gedacht das geht auch mit einer tlb aus Visual Studio heraus.
            Wenn das nicht geht kannst du das immer noch mit dem TlbImp Tool nachholen.

            Comment


            • #7
              Also das mit dem tlbImp das werde ich mir gleich als erstes anschauen

              Danke nochmals für den Tip.


              Freundliche Grüsse und schönen Abend.

              exc-jdbi

              Comment


              • #8
                tlb,Com-Interop

                Guten Abend Ralf Jansen

                Den ersten Teil der Aufgabe die du mir in #4 gezeigt hast, hab ich hinbekommen. Ich hab also den direkten Zugriff auf die tlb-Datei gemacht. Eine wirklich raffinierte Methode.

                Um sich die entsprechenden Funktionen in der tlb-Datei zunutze zu machen, musste ich jedoch über die InvokeMember-Methode gehen, dann funktionierte es auch wirklich einwandfrei. Die folgende Zeile konnte ich leider in VB.Net nicht nutzen. Das wäre zu schön gewesen.
                [highlight=vbnet]

                intf.MeineLiebeMethode();

                'Stattdessen in VB.Net zum Beispiel für eine Funktion ohne Argumentenübergabe
                Dim intArr As Integer(,) = CType(typT.InvokeMember("CreateIntArray", Reflection.BindingFlags.InvokeMethod, Nothing, intf, Nothing), Integer(,))
                [/highlight]

                Was mich aber ein wenig gestört hat ist das Intellisense (Arbeite mit VB.Net 2010 Express) gar nicht funktionierte. Ich konnte mir also in keiner Weise ein Bild machen, welche Funktionen mir nun wirklich zur Verfügung stehen. Ich nehme an, es gibt so auf diesem Wege keine Möglichkeit, diese sofort herauszufinden.

                Die andere Variante des Zugriffs, über die vorgängige TlbImp werde ich nächste Woche mir anschauen.

                Nochmals Danke für alles


                Freundliche Grüsse


                exc-jdbi
                Zuletzt editiert von Exc-JDBI; 02.08.2012, 00:09. Reason: Korrektur

                Comment


                • #9
                  Iehhh. Ich war immer der Meinung der dynamic Datentyp wäre dem Standardverhalten von VB.Net abgeguckt. Ist wohl doch nicht ganz so. Laut Doku müsste man wohl
                  Option Strict Off
                  setzen. Soweit ich die Doku verstehe gilt das dann aber scheinbar fürs gesamte Projekt. Das will man wohl kaum haben

                  Comment


                  • #10
                    Guten Abend Ralf Jansen

                    Welches Option Strict ON meinst du nun? Das in der Com-Dll?

                    Wenn ich ehrlich sein will, ich habe mich zwischenzeitlich so an das Option Strict ON gewöhnt, dass ich es bei mir fix hinterlegt habe. Ich werde aber den Versuch noch machen.

                    Freundliche Grüsse

                    exc-jdbi

                    Comment

                    Working...
                    X