Announcement

Collapse
No announcement yet.

NET Control als OCX nutzen

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

  • NET Control als OCX nutzen

    Hallo,

    ich mache so die ersten Gehversuche mit VB.NET 2008 Express Edition und versuche, neu erstellte Assemblies von COM aus (VB6) aufzurufen. Was relativ auf Anhieb klappte war der Aufruf eines NET-Assemblies aus VB6 als DLL. Die Vorgehnsweise war wie folgt:

    1) Erstellen der NET-Assembly und Testen mit NET-Client Anwendung
    2) Neu Kompilieren der Assembly mit der Option 'Assembly COM sichtbar machen'
    3) Erstellen der tlb und Registrieren mit RegAsm.exe
    4) Erstellen VB-Anwendung, Verweis auf neu erstellte NET-DLL

    Völlig analog wollte ich im nächsten Schritt eine NET-Control erstellen und analog einer OCX einbinden. Dazu erstellte ich ein neues Projekt vom Typ Klassenbibliothek (für Controls gibt es keine Vorlage für VB NET Express). In diesem Projekt fügte ich ein Windows Control hinzu und führte die oben aufgeführten Schritte 1-3) analog erfolgreich durch.

    Bei 4) stoße ich dann auf Probleme. Ich sehe zwar die DLL unter Verweise, kann sie einbinden und die zu Testzwecken erstellte Properties setzen und abfragen. Aber ich sehe die DLL nicht als Control. Unter Komponenten, wo ich andere OCX als Steuerelemente normal einbinde, taucht die NET-DLL nicht auf.

    Irgendwo habe ich gelesen, dass eine Klasse, mit der man das erreichen will von System.EnterpriseServices.ServicedComponent abgeleitet sein muss. Meine Klassen sind dagegen von System.Windows.Forms.UserControl abgeleitet. Egal wie, ich bin für jeden Tip dankbar.

  • #2
    Hallo,

    http://www.google.at/search?hl=de&q=...t+control+acti

    liefert genügend Treffer. AcitiveX und ocx sind synonym.

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

    Comment


    • #3
      Hallo Gfoidl,

      wenn ich nicht schon vorher wie wild über Stunden gegoogelt hätte, wäre ich ja gar nicht so weit gekommen. Mittlerweile haben weitere Tests gezeigt, dass ich das NET Control als OCX in ein Web-Formular einbinden kann, da man dort über die Class-ID referenziert. Außerdem sehe ich das Control unter den Office VBA Editoren.

      Was mir fehlt, ist die Sichtbarkeit unter VB6 als Komponente. Einige Hinweise im Netz gehen davon aus, dass die Registrierung unvollständig (fehlende Schlüssel Control und MiscStatus) und diese habe ich manuell nachgezogen. Dennoch fehlt mir die Sichtbarkeit unter VB6 und langsam bekomme ich graue Haare.

      Comment


      • #4
        Hi,

        dieser Artikel beschreibt wies geht:

        http://www.codeproject.com/KB/miscctrl/exposingdotnetcontrols.aspx

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

        Comment


        • #5
          Hallo Gfoidl,

          die Funktionen aus dem Artikel fügen ja auch nur Registry-Einträge hinzu, die ich halt manuell nach ausführen von RegAsm erstellt habe. Für den Moment gebe ich einfach auf, in der Praxis wird mit Interop mit VbScript und VBA reichen, und da klappt es ja.

          Grüße, RR

          Comment


          • #6
            Hallo,

            hab das Bsp. von Codeproject (obiger Link) mal ausprobiert - es funktioniert wenn eine zusätzliche Einstellung gemacht wird. Siehe hierzu angehängtes Bild.

            In VB dann den Verweis hinzufügen.

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

            Comment


            • #7
              Hallo Günther,

              wie gesagt das COM Interop habe ich natürlich verwendet, sonst könnte ich das Assembly ja nicht als COM Control unter IE oder Office VBA Forms einbinden. Ich sehe es ja nur unter VB6 nicht, kann es aber auch dort zumindest mit CreateObject erstellen.

              Das Beispiel im Netz ist leider in C#, ich habe und kenne nur VB-Express und diese Direktriven in eckigen Klammen sind mir unklar. Aber soweit ich es verstehe, addiert die [ComRegisterFunction()] nur ein paar zusätzliche Einträge in der Registry (keine Ahnung, wann diese Methode aufgerufen wird, eventuell bei RegAsm???) und die Codebase wird bei entsprechenden Schalter auch durch RegAsm eingetragen, den Control-Key habe ich manuell erstellt.

              Eventuell kannst du mir mal das kompilierte Assembly bereitstellen, dann kann ich mir die erstellen Registry-Einträge ansehen. und vergleichen. Ich bin nach folgenden Artikel vorgegangen, wobei ich wie gesagt versucht habe, die Registry Einträge manuell zu erstellen:

              http://www.ondotnet.com/pub/a/dotnet...mshosting.html

              Grüße, Rainer

              Comment


              • #8
                Hallo Rainer,

                hab mein C#-Projekt mit der Entwicklungumgebung #Develop nochmals erstellt (normal verwende ich Visual Studio). Mit #Develop ist es möglich von C# nach VB.net konvertieren zu lassen und vice versa. Das gleiche Konvertierungstool gibts auch online (http://www.developerfusion.com/tools/convert/csharp-to-vb/).

                Angehängt hab ich beide Projkete (C# und VB.net).

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

                Comment


                • #9
                  Etwas Grundlegendes wurde bisher noch nicht erwähnt:

                  In .net ist es nicht vorgesehen ActiveX-Controls (OCX) zu erstellen!

                  http://bytes.com/groups/net-c/261815-how-do-i-make-c-usercontrol-into-ocx-file-vb6-use

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

                  Comment


                  • #10
                    Hallo Günther,

                    danke für die Mühe. Ich habe die gelieferte DLL mit RegAsm registriert und sie hat tatsächlich die zusätzlichen Registry-Schlüssel hinzugefügt. Der Effekt ist aber der gleiche wie bei den von mir erstellten und registrierten Controls. Ich kann es unter IE oder Office VBA einbinden, unter VB6 aber sehe ich dieses Control nicht. Entweder sieht man diese NET Controls also ohne dieses Shim Control unter VB6 nie oder da ist etwas komisch an meiner Umgebung.

                    Grüße, Rainer

                    Comment


                    • #11
                      oder da ist etwas komisch an meiner Umgebung.
                      Deine Umgebung stimmt schon - du darfst nur nicht erwarten dass das Control in der Steuerelement-Toolbox erscheint. Das geht nämlich nicht.

                      Die einzige Möglichkeit ist das Einbinden des .net-Controls als Verweis - das funktioniert ja.

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

                      Comment


                      • #12
                        Hallo Günther,

                        als Verweis schon, das schrieb ich ja schon im ersten Beitrag. Aber mir ist nicht klar wie ich es dann auf die Oberfläche bringe und sichtbar mache. Dann hat man wohl auch weniger die Properties wie Top oder Height, um bei Form Resize Events das Control zu positionieren. Oder sollte das doch gehen?????

                        Grüße, Rainer

                        Comment


                        • #13
                          Hallo,

                          es geht schon - ist aber VB6 spezifisch.

                          Ein Statement warum es nicht so geht wie du willst: http://support.microsoft.com/?scid=kb;EN-US;311334

                          Der VB6-Teil: http://www.codeproject.com/KB/vb-interop/UsingDotNETControlsInVB6.aspx

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

                          Comment


                          • #14
                            Hallo Günther,

                            Jubel, Freu, Hüpf, ES GEHT und das war der sogenannte Missing Link. der VBControlExtender war mir unbekannt und genau das, was ich suchte. Definiert man nicht wie im Beispiel nur 1 Object, sondern 2, etwa

                            [highlight=vb]
                            Dim oCarControl As VBControlExtender
                            Dim oCar as CarControl.Car
                            [/highlight]

                            und setzt beim Load

                            [highlight=vb]
                            Set oCarControl = Controls.Add("CarControl.Car", "car", Me)
                            Set oCar = oCarControl.Object
                            [/highlight]

                            Dann steht für oCar sogar die bequeme Intellisense-Unterstützung von VB zur Verfügung.

                            Nochmals Danke für die Unterstützung und Geduld.
                            Grüße, Rainer
                            Zuletzt editiert von gfoidl; 16.05.2009, 14:45. Reason: Code-Formatierung

                            Comment


                            • #15
                              Super, da wir beide was gerlernt - ich wusste das vorher auch nicht.

                              Dass auch Intellisense geht finde ich praktisch.

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

                              Comment

                              Working...
                              X