Announcement

Collapse
No announcement yet.

ActiveX/COM Schnittstelle zur Laufzeit laden

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

  • ActiveX/COM Schnittstelle zur Laufzeit laden

    Hallo zusammen,

    nachdem ich nun Tagelang rumprobiert habe und kurz vor dem verzweifeln bin hoffe ich mir kann jemand von euch helfen.

    Ich habe folgendes Problem:

    Ich habe eine Anwendung in VB.net geschrieben die eine Drittanbieter Software
    per ActiveX-Com Komponente steuert.
    Die Activex-Komponente ist versionspezifisch, so daß es nötig wäre für jede Programmversion die entsprechende Com-Komponente als Verweis in das Projekt einzubinden und somit für jede Programmversion des Drittanbieters auch immer eine separate Anwendung von mir zu liefern.

    Ich frage mich ob es nicht möglich wäre den Verweis auf die Com Komponente zur Laufzeit, also beim Programmstart vorzunehmen, so daß ich mit meiner Anwendung beim Programmstart prüfe welche Version der Dittanbietersoftware der Kunde nutzt um dann die entsprechende COM-Komponente einzubinden.
    Das Einbinden von mehreren Verweisen/Komponeten in ein Projekt geht nicht, da der Namespace und der Assemblyname bei den COM-Komponenten identisch und VS sofort streikt mit dem Hinweis daß bereits eine Assembly mit diesem Namen vorhanden ist.
    Komponenten identisch ist
    Ich würde mich freuen, wenn jemand nen Rat oder Beispiel hätte wie das zu bewerkstelligen ist

    Gruß
    Synapse

  • #2
    Die Activex-Komponente ist versionspezifisch, so daß es nötig wäre für jede Programmversion die entsprechende Com-Komponente als Verweis in das Projekt einzubinden und somit für jede Programmversion des Drittanbieters auch immer eine separate Anwendung von mir zu liefern.
    Du meinst die Komponente ist nicht abwärtskompatibel? Da würde ich nochmal über die Wahl deines Drittanbieters nachdenken.

    Ein Stichwort um das zu lösen wäre Late Binding. Ich habe leider keine vernünftige Erklärung dazu in der MSDN bezogen auf VB.NET gefunden. Hier gibt es zumindest ein Beispiel.

    Comment


    • #3
      Hallo,

      mir fallen 2 Möglichkeiten ein:
      • spätes Binden durch Reflektion (ist aber aufwändig)
      • ertellen eines Wrapper mit AxHost - so wird nur die ClassID benötigt und sollte für jede Version der ActiveX-Komponente funktionieren (die ClassID ist bei allen 32bit gleich).



      mfG Gü
      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

      Comment


      • #4
        Du meinst die Komponente ist nicht abwärtskompatibel?
        Glaube ich nicht
        Beispiel: Wenn du während der Entwicklung einen Verweis auf Excel 10 einbindest und der Anwender hat eine abweichende Version gehts nicht mehr.


        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Wenn du während der Entwicklung einen Verweis auf Excel 10 einbindest und der Anwender hat eine abweichende Version gehts nicht mehr.
          Für Office gibt es versionsunabhängige PIA's. Solange der Anwender also etwas größer 10 hat geht es. Zumindest theoretisch. Office ist leider auch nicht immer so dolle abwärtskompatibel

          Comment


          • #6
            Originally posted by gfoidl View Post
            Beispiel: Wenn du während der Entwicklung einen Verweis auf Excel 10 einbindest und der Anwender hat eine abweichende Version gehts nicht mehr.
            Das dürfte doch bei VB.NET nicht der Fall sein. Diese m.E. mangel des COM-Supports hat AFAIK nur C#

            Comment


            • #7
              Das dürfte doch bei VB.NET nicht der Fall sein. Diese m.E. mangel des COM-Supports hat AFAIK nur C#
              Weiß ich nicht. Aber könnte schon sein dass die VB-Runtime dies erlaubt (bei den Parametern hat VB.net in Bezug auf COM auch Vorteile).

              Für Office gibt es versionsunabhängige PIA's.
              Ja ich weiß - hab ein schlechtes Bsp. gewählt -> ersetze Excel mit Adobe Reader

              mfG Gü
              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

              Comment


              • #8
                Ist definitv so. Die Abwärtskompatibilität ist nicht gegeben.

                Ich muss gestehen, was die Sache mit Axhost angeht bin ich mehr als ein blutiger Anfänger, könnt ihr mir da ein wenig auf die Sprünge helfen ?
                Ich hoffe das ist nicht zu dreist

                Comment


                • #9
                  Hallo,

                  ein Beispiel für den Adobe Reader:
                  [highlight=vbnet]
                  Imports System
                  Imports System.Collections.Generic
                  Imports System.Linq
                  Imports System.Text
                  Imports System.Runtime.InteropServices
                  Imports System.Windows.Forms
                  Imports System.Reflection

                  ''' <summary>
                  ''' .NET Wrapper für Adobe Reader ActiveX-Steuerelement
                  ''' </summary>
                  Public Class AdobeReaderControl
                  * * Inherits AxHost
                  * * ''' <summary>
                  * * ''' Hostet das Adobe Reader ActiveX-Steuerelement in Windows.Forms.
                  * * ''' </summary>
                  * * Public Sub New()
                  * * * * MyBase.New("{CA8A9780-280D-11CF-A24D-444553540000}")
                  * * * * ' CLSID des Adobe Readers (ist bei allen 32-Bit Versionen gleich)
                  * * End Sub
                  * *
                  * * ''' <summary>
                  * * ''' Lädt eine PDF-Datei.
                  * * ''' </summary>
                  * * ''' <param name="path">Pfad</param>
                  * * Public Sub LoadFile(ByVal path As String)
                  * * * * ' LoadFile-Methode auf dem Adobe Reader aufrufen
                  * * * * Me.GetOcx().[GetType]().InvokeMember("LoadFile", BindingFlags.InvokeMethod Or BindingFlags.OptionalParamBinding, Nothing, Me.GetOcx(), New Object(0) {path})
                  * * End Sub
                  * *
                  * * ''' <summary>
                  * * ''' Druckt die geladene PDF-Datei.
                  * * ''' </summary>
                  * * Public Sub Print()
                  * * * * ' Print-Methode auf dem Adobe Reader aufrufen
                  * * * * Me.GetOcx().[GetType]().InvokeMember("Print", BindingFlags.InvokeMethod Or BindingFlags.OptionalParamBinding, Nothing, Me.GetOcx(), New Object(-1) {})
                  * * End Sub
                  End Class
                  [/highlight]
                  (Quelle: http://dotnet-snippets.de/dns/adobe-reader-versionsunabhaengig-und-ohne-com-verweis-hosten-SID1225.aspx


                  mfG Gü
                  "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                  Comment


                  • #10
                    Wie erstelle ich ein PlugIn System unter VB.NET (Framework 2) <<<< schau hier rein
                    VB 2005/ VB2008/ VB6

                    Comment

                    Working...
                    X