Laden...

.NET Assembly für COM sichtbar machen - funktioniert nicht

Erstellt von WhiteGloves vor 13 Jahren Letzter Beitrag vor 13 Jahren 5.612 Views
W
WhiteGloves Themenstarter:in
109 Beiträge seit 2009
vor 13 Jahren
.NET Assembly für COM sichtbar machen - funktioniert nicht

Hallo Zusammen,

ich wende mich mit einer, für mich haarsträubenden, Frage an euch.

Ich habe in C# (.NET 3.0 Visual Studio 2010) eine Klassenbibliothek erstellt.
(In dieses Projekt habe ich zusätzlich eine COM Bibliothek eingebunden...)

Da ich die C#/.NET DLL in einem VB6 Projekt verwenden muss, habe ich die Assembly für COM sichtbar gemacht sowie "Für COM-Interop registrieren" angehackt.

Beim Kompilieren erhalte ich dann also eine DLL sowie eine TLB Datei und eine Interop.Name.dll Datei.

Anschließend habe ich die TLB Datei in VB6 als Verweiß hinzugefügt.
Alles kein Problem.

Wenn ich allerdings auf einem anderen PC, auf dem das Visual Studio Klassenbibliotheksprojekt nicht kompiliert wurde, versuche das VB6 Projekt zu starten erhalte ich die Meldung "Can't create Active-X Object"

Mir ist aufgefallen, dass sich der Name meiner .NET Assembly an sehr vielen Stellen in der Registry befindet.
Wenn ich versuche eine der 3 Dateien (TLB, DLL bzw. diese Interop) auf dem anderen PC zu registrieren (regsvr32) dann schlägt dieses aus verschieden Gründen fehl (Keine gültige DLL Datei, usw)

Anschließend habe ich diesen Artikel bei Microsoft gefunden:
Regasm.exe (Assembly Registration-Tool)

Dort ist in etwa beschrieben wie ich die Assembly auf manuellem Wege für COM sichtbar mache, allerdings komme ich damit auch nicht weiter.

Was muss ich also tun, um die in .NET erstellte DLL-Datei/Assembly auf einem anderen PC in VB6 verwenden zu können?!

Vielen Dank für Hilfe, ich bin echt am Verzweifeln.

Hallo, ich heiße Hein Blöd und bin Softwareentwickler

114 Beiträge seit 2009
vor 13 Jahren

Sowas ähnliches haben wir auch im Einsatz. Ich habe mir zum registrieren der Komponente mal eine Batch geschrieben.


set dnf=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
set sdk=C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin

;win7 64
set sdk=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin

%dnf%\regasm Fnord.dll /regfile:Fnord.reg
"%sdk%\gacutil" /i "Fnord.dll"

Nachdem das durchgelaufen ist, müsstest du eine Fnord.reg haben. Die wird dann als Admin ausgeführt. Wenn du auf ein x64-System arbeitest musst du darauf achten, dass die Einträge nach Wow6432Nord verschoben werden müssen.

Vielleicht kommst du damit weiter.

B
22 Beiträge seit 2008
vor 13 Jahren
...\regasm.exe deineDll.dll /codebase /tlb 

Damit exportierst du deine .NET DLL in eine TypeLib und registrierst sie im System (Registry Einträge werden erzeugt).

W
WhiteGloves Themenstarter:in
109 Beiträge seit 2009
vor 13 Jahren

Okay das klingt ja schon mal interessant.
Allerdings müsste ich dieses ja auf jeder Maschine durchführen, auf der die DLL mal laufen soll.

Und wenn ich das richtig sehe, gibt es die regasm.exe nur auf Maschinen, auf denen auch Visual Studio bzw. die Visual Studio Tools installiert sind...

Das kann doch nicht sein?! -> Dann müsste ich beim Kunden ja ein Visual Studio vorraussetzen...

Hallo, ich heiße Hein Blöd und bin Softwareentwickler

B
22 Beiträge seit 2008
vor 13 Jahren

Mit Visual Studio wird auch das SDK vom .Net Framework 2.0 mit installiert. Dieses ist aber auch einzeln bei Microsoft erhältlich (google mal nach .Net Framework 2.0 SDK).
Mit dem SDK werden auch die Tools wie regasm installiert.

Auf jedem PC wo dein Programm laufen soll, muss du diese DLL dann entsprechend registrieren.

Du kannst natürlich auch, wie von Levion beschrieben, mit Hilfe von regasm eine Registrierungsdatei erzeugen lassen und diese auf dem PC ausführen.

W
WhiteGloves Themenstarter:in
109 Beiträge seit 2009
vor 13 Jahren

Leider funktioniert keine der hier genannten Möglichkeiten.

Die VB6 Anwendung schmeißt immer den Fehler "Automation error", nur auf der Maschine auf der die .NET DLL kompiliert wurde funktioniert es reibungslos...

Hallo, ich heiße Hein Blöd und bin Softwareentwickler

156 Beiträge seit 2010
vor 13 Jahren

Du hast aber auch auf der anderen Maschine .NET installiert?

W
WhiteGloves Themenstarter:in
109 Beiträge seit 2009
vor 13 Jahren

Ja, auch Visual Studio etc.

Ist fast die selbe Maschine nur das es eine 64Bit Maschine ist. (Könnte das damit zusammenhängen?)
Zusätzlich hab ich noch eine andere Maschine mit .NET und ohne Visual Studio in 32bit wo das selbe Verhalten ist.

Setze gerade eine WinXP VM auf um in dieser das Verhalten zu testen.

Versuche gerade an eine regtlib.exe zu kommen, (die ich bisher auf keiner Maschine gefunden habe) um damit mal die TLB zu registrieren und dann in das VB6 Projekt zu referenzieren...

Hallo, ich heiße Hein Blöd und bin Softwareentwickler

E
395 Beiträge seit 2007
vor 13 Jahren

Wenn du auf ein x64-System arbeitest musst du darauf achten, dass die Einträge nach Wow6432Nord verschoben werden müssen.

MfG Paul

B
22 Beiträge seit 2008
vor 13 Jahren

Leider funktioniert keine der hier genannten Möglichkeiten.

Die VB6 Anwendung schmeißt immer den Fehler "Automation error", nur auf der Maschine auf der die .NET DLL kompiliert wurde funktioniert es reibungslos...

Dann hast du ja scheinbar auf allen anderen Maschinen deine .Net DLL nicht richtig für COM Interop registriert.

Wie hast du denn in deinem VB Projekt auf die TLB deiner .Net Assembly verwiesen? Über das Dateisystem oder über die im System registrierten Verweise?
Binde auf jeden Fall einen im System Registrierten (COM) verweis ein.

Versuche gerade an eine regtlib.exe zu kommen, (die ich bisher auf keiner Maschine gefunden habe) um damit mal die TLB zu registrieren und dann in das VB6 Projekt zu referenzieren....

Warum?
Registriere deine .NET DLL (nicht die Interop und auch nicht die TLB) auf dem System, wo dein Programm ausgeführt wird via regasm (siehe meinen Aufruf von oben).

Du schreibst oben, das du in deinem .NET Projekt einen verweis auf eine COM Bibliothek hast. Ist diese COM Bibliothek auch auf allen anderen Systemen installiert/registriert?