Laden...

C#-dll in VB6 ?

Erstellt von Guggsdu vor 17 Jahren Letzter Beitrag vor 17 Jahren 7.876 Views
Guggsdu Themenstarter:in
220 Beiträge seit 2004
vor 17 Jahren
C#-dll in VB6 ?

Tach zusammen!

Ist es möglich eine dll in C# zu schreiben und diese in VB6 einzubinden?
Der Hintergrund ist folgender: Ein laufendes Projekt (VB6) wird nach C#.Net umgesetzt. Da aber der Kunde schreit, muß auch an der VB-Version noch einiges gemacht werden. Um sich aber Arbeit zu ersparen, soll eine dll geschrieben werden, die in beiden Projekten genutzt werden kann.

Gibt es Lösungen?

Gruß
Guggsdu

6.862 Beiträge seit 2003
vor 17 Jahren

Ja, einfach die C# DLL als COM Komponente veröffentlichen und du kannst aus VB drauf zugreifen.

Baka wa shinanakya naoranai.

Mein XING Profil.

4.207 Beiträge seit 2003
vor 17 Jahren

Ja, ich habe genau dies auch schon einmal machen müssen .... meine Erfahrungen zusammengefasst findest Du unter http://www.des-eisbaeren-blog.de/Default.aspx?Guid=4bc3cb5b-984f-412b-a53e-fb0c39e13a6e ... vielleicht hilft's Dir ein wenig weiter ...

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

Guggsdu Themenstarter:in
220 Beiträge seit 2004
vor 17 Jahren

Aha - schon ein Stück weiter.
Aber wie zum Henker kann ich dann diesen Code in VB einbinden und nutzen???

Ich versuche es mit:

Public Declare Function Foo Lib "MyLib.dll" (ByVal lala As String)

Aber es kommt nur: 'Datei nicht gefunden: MyLib.dll'
Aber die leigt direkt daneben (neben der mdb - ich will aus einer Access-Datei darauf zugreifen)

Gruß
Guggsdu

3.728 Beiträge seit 2005
vor 17 Jahren
Com

Declare ... ist für C++ DLLs, nicht für COM-Komponenten.

Du fügst das Teil einfach als COM-Verweis zu. Dazu sind folgende Schritte nötig:

  • Öffne den VBA Editor von Access (Alt + F11)
  • Menü Extras
  • Verweise
  • Wenn Deine C# Assembly korrekt für COMInterop registriert wurde, findest Du sie in der Liste
  • Häckchen reinmachen
  • Fertig!

Wenn Du keine expliziten COM-Schnittstellen mit CLSIDs und IIDs und dem ganzen Kram in die C# Assembly eingebettet hast, geht allerdings nur die Dispatch-Schnittstelle. Das heißt konkret, dass nur späte Bindung funktioniert. Also keine Intellisense im VBA Editor.

Guggsdu Themenstarter:in
220 Beiträge seit 2004
vor 17 Jahren

Geil! Das geht ja!!!

Heißen Dank!

Gruß
Guggsdu

O
54 Beiträge seit 2004
vor 17 Jahren

Hallo,

stehe vor einem ähnlichen Problem:

ich habe eine C#-Dll erstellt und möchte diese als COM-Komponente veröffentlichen, um sie in einer anderen Programmiersprache zu nutzen.
Es gelingt mir jedoch nicht, die Registrierung durchzuführen (regasm test.dll). Bricht ab mit Fehlermeldung "test.dll konnte nicht geladen werden, da es keine gültige .NET-Assembly ist".

In ein anderes C#-Projekt kann ich die DLL aber problemlos einbinden, wenn ich sie in die Toolboxelemente per Suchdialog übernehme und das Usercontrol dann in die Form ziehe.
Ich habe mir den Link von Golo Haas angeschaut, verstehe den jedoch nicht so richtig.

Was mache ich bei der Registrierung verkehrt?

In Sachen dll und COM etc. habe ich keinerlei Erfahrungswerte; es ist sehr gut möglich, dass hier was grundlegend beim Erstellen der DLL verkehrt gelaufen ist.

Gruß obbi

S
8.746 Beiträge seit 2005
vor 17 Jahren

Hast du auch eine Methode, die mit [ComRegisterFunction] ausgezeichnet ist?

O
54 Beiträge seit 2004
vor 17 Jahren

Hallo,

danke für die schnelle Antwort.

Hast du auch eine Methode, die mit [ComRegisterFunction] ausgezeichnet ist?

nein, habe ich nicht.
Wozu ist das notwendig und was muss ich da tun?

S
8.746 Beiträge seit 2005
vor 17 Jahren

U.U. ist es notwendig, nämlich dann, wenn es sich nicht um einen normalen COM-Server handelt, sondern um eine ActiveX bzw. ein Automation-Add-In. Ich würde aber vermuten, dass das erst einen Fehler bei der Benutzung produziert und nicht schon bei der Registrierung.

128 Beiträge seit 2004
vor 17 Jahren

Hallo,

Original von Guggsdu
Ist es möglich eine dll in C# zu schreiben und diese in VB6 einzubinden?
Gibt es Lösungen?

Ja, über die COM-Schnittstelle. Ich habe in meinem Blog ein paar Artikel zu dem Thema geschrieben. Es wird zwar Visual FoxPro statt VB6 als Client genutzt, aber das ist im Prinzip egal.

http://jochen.kirstaetter.name/cat/index/10/NET-Framework

Zum Experimentieren kannst du dir gerne den COM Proxy for .NET ziehen und damit in VB6 spielen. Aktuell bietet der COM Proxy folgende Klassen an:

http://jochen.kirstaetter.name/files/ComProxyForNet.msi

  • Regex - Reguläre Ausdrücke
  • WinForm - Windows Forms (experimentell)
  • EventLog - Ausgaben ins Windows Ereignisprotokoll schreiben
  • Imaging - Bildmanipulation (experimentell)

In VB6 kannst du den Objektbrowser verwenden. Ansonsten erzeugst du dir die Objektreferenz genau wie beispielsweise der OLE Automation von Word oder so.

Bis denne, JoKi

Bis denne, JoKi

Enjoy AFP FAQ - Participate AfpWiki - Get Blogged by JoKi - Talk to me at VFP User Group Meeting

128 Beiträge seit 2004
vor 17 Jahren

Hallo,

Original von obbi
Es gelingt mir jedoch nicht, die Registrierung durchzuführen (regasm test.dll). Bricht ab mit Fehlermeldung "test.dll konnte nicht geladen werden, da es keine gültige .NET-Assembly ist".

Hast du in den Projekteigenschaften eingestellt, dass dein Projekt "Register for COM interop" true hat?

Vielleicht helfen dir zwei Einträge in meinem Blog weiter:

http://jochen.kirstaetter.name/post/index/341/NET-per-COM-nutzen
http://jochen.kirstaetter.name/post/index/349/Windows-Forms-in-VFP

Das Attribute [ComRegisterFunction] wird übrigens nur für eine Methode benötigt, welche beim Ausführen der Registrierung durchgeführt wird und damit individuelle Ergänzungen und zusätzliche Manipulationen gestattet. Prinzipiell braucht man dieses Attribut erst bei Spezialisierungen.
Interessanter ist eher, dass man über das Attribute [ComVisible(true|false)] Methoden für die Type Library als sichtbar oder unsichtbar deklariert.

Bis denne, JoKi

Bis denne, JoKi

Enjoy AFP FAQ - Participate AfpWiki - Get Blogged by JoKi - Talk to me at VFP User Group Meeting

128 Beiträge seit 2004
vor 17 Jahren

Hallo svenson,

Original von svenson
U.U. ist es notwendig, nämlich dann, wenn es sich nicht um einen normalen COM-Server handelt, sondern um eine ActiveX bzw. ein Automation-Add-In. Ich würde aber vermuten, dass das erst einen Fehler bei der Benutzung produziert und nicht schon bei der Registrierung.

ACK! Eine weitere Möglichkeit ist zum Produzieren von VersionIndependentProgIDs um bspw. mehrere versionierte COM-Server mit unterschiedlichen ProgIDs über eine neutrale instanziieren zu können.

Bis denne, JoKi

Bis denne, JoKi

Enjoy AFP FAQ - Participate AfpWiki - Get Blogged by JoKi - Talk to me at VFP User Group Meeting

O
54 Beiträge seit 2004
vor 17 Jahren

Hallo zusammen,
erst mal danke für Eure Antworten.
Ich fürchte, so langsam verliere ich jetzt den Überblick, was die Begrifflichkeiten/Techniken angeht. Vielleicht liege ich aber mit der Technik, die ich einsetzen will, total daneben.
Ich schildere einfach noch mal mit anderen Worten, was ich machen will (bzw. machen muss, da ich bestimmte zwingende Randbedingungen habe):
Ein bestehendes, sehr umfangreiches Projekt ist mit einer bestimmten Programmiersprache erstellt (uniface). Uniface arbeitet (ähnlich wie VB.NET oder C#.NET) mit Forms und kann auf einer solchen Form einen OCX-Container darstellen und diesem OCX-Container ein bestimmtes OCX (wird in einer Liste zur Auswahl angeboten) zuordnen und dieses OCX dann auch ansprechen (Funktionen aufrufen etc.), z.B. ein Kalendersteuerelement.
Ich möchte nun mit C# ein solches OCX erstellen. Das OCX soll mehrere Steuerelemente beinhalten, z.B. ein TreeView, mehrere Buttons, Listboxen etc. Die Oberfläche, die ich in diesem OCX entwickle, soll nicht als eigenes Fenster dargestellt werden, sondern in diesem OCX-Container von Uniface.
Jetzt meine Fragen:

  1. Geht das überhaupt (meiner Meinung nach ja, denn das Kalendersteuerelement funktioniert ja irgendwie auch)?
  2. Welche Projektart muss ich in C# wählen (meiner Meinung nach eine Klassenbibliothek)?
  3. Muss ich diese Klassenbibliothek dann als COM-Server registrieren (ich habe die Beispiele von Euch mal durchgespielt, kann dann aber nach der Registrierung nichts dem OCX-Container zuweisen, da die C#-DLL nicht in der OCX-Liste erscheint)?
  4. Muss ein OCX irgendwie bei der Erstellung gegenüber einer COM-Componente besonders behandelt werden?
    Puh, ein bißchen viel Fragen auf einmal; ich hoffe, ich habe mich verständlich ausgedrückt... 🙂

Gruß obbi

6.862 Beiträge seit 2003
vor 17 Jahren

OXC sind ja keine normalen COM Komponenten sondern ActiveX Controls, und aus eigener Erfahrung kann ich sagen, dass man solche an sich nicht in .Net schreiben kann.
Manche ActiveX Hosts wie der IE können auch .Net Controls die per COM veröffentlicht wurden als ActiveX Controls laden. Aber in wirklichkeit sind das keine reinen ActiveX controls und es ist nicht garantiert das jeder ActiveX Host die laden kann.

Genau das wird auch bei eurem Projekt der Fall sein. Es war auch ähnlich bei uns, aber die Entwickler haben wohl nen Weg gefunden indem sie mit managed C++ nen Wrapper um des .Net Control geschrieben haben, das dann aus nativen C++ aufgerufen werden konnte, und nun können auch .Net Controls wie ActiveX Controls dargestellt werden.

Baka wa shinanakya naoranai.

Mein XING Profil.

S
8.746 Beiträge seit 2005
vor 17 Jahren

Hiier mal ein Link:

http://www.codeproject.com/cs/miscctrl/exposingdotnetcontrols.asp?df=100&forumid=2373&select=958777#xx958777xx

Bitte auch die Anmerkungen der Leser bezüglich VB6 beachten. Es gibt da ein paar Fallstricke... prinzipiell geht das aber.