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
Ja, einfach die C# DLL als COM Komponente veröffentlichen und du kannst aus VB drauf zugreifen.
Baka wa shinanakya naoranai.
Mein XING Profil.
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
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
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:
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.
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
Hast du auch eine Methode, die mit [ComRegisterFunction] ausgezeichnet ist?
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?
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.
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
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
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
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
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:
Gruß obbi
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.
Hiier mal ein Link:
Bitte auch die Anmerkungen der Leser bezüglich VB6 beachten. Es gibt da ein paar Fallstricke... prinzipiell geht das aber.