Wie fügt man dem VB6 (oder VBA) References Dialog ein COM-Exposed .NET Projekt hinzu?

9

Ich habe eine .NET-Assembly erstellt, die nach dem Ausnahmebeispiel Erstellen und Bereitstellen einer .NET COM-Assembly von Phil Wilson.

Und alles funktioniert gut in dem Sinne, dass die .NET-Assembly ordnungsgemäß für COM registriert ist, und kompilierter COM-Code kann es ohne Probleme aufrufen.

Das einzig Seltsame ist, dass das Entwickeln gegen die COM-exposed .NET-Assembly bei Verwendung von VB 6.0 oder VBA erfordert, dass der Programmierer den genauen Dateispeicherort der zugehörigen TLB-Datei durchsucht, wonach alles einwandfrei funktioniert. Das heißt, die Klassenbibliothek wird nicht direkt im Dialogfeld "Verweise" angezeigt. Sie müssen daher zum Speicherort der Datei navigieren.

Auch hier funktionieren die COM Interop-Aspekte zu 100%; Ich würde jedoch denken, dass eine Einstellung vorhanden sein muss, die die Bibliothek im Dialogfeld "Verweise" für VB 6.0 und VBA direkt sichtbar macht.

Weiß jemand, wie diese Einstellung aussehen würde? Oder sollte dies automatisch für mich geschehen, nur weil ich es registriert habe?

Vielen Dank im Voraus für jeden Rat ...

Mike

Bearbeiten / Aktualisieren

Um jpohs Frage zu beantworten, ob ich den / codebase-Schalter verwende, verwende ich ein .msi-Setup-Paket und verwende RegAssm nicht explizit. Die Assembly wird ordnungsgemäß registriert, was daran erkennbar ist, dass der Schlüssel 'CodeBase' in HKCR \ CLSID {myGUID} \ InprocServer32 den vollständigen Pfad zur Assembly korrekt enthält. Kompilierte COM-Komponenten werden gegen diese DLL ausgeführt, aber nur wenn sie dagegen mit VB 6.0 oder VBA entwickelt werden, erscheinen sie nicht im Referenzdialogfeld. Ich muss daher zum richtigen Speicherort der Datei "navigieren", nach dem es 100% gut funktioniert.

Update # 2

Nach weiteren Nachforschungen scheint es, dass obwohl die Klassen-GUIDs korrekt registriert werden, meine .tlb-Datei nicht registriert wird. Ich habe keine Ahnung warum nicht. Das Registrieren der TLB-Datei sollte einige Registrierungseinträge für die Schnittstelle, auf der meine Klasse basiert, in HKCR \ Interface {myInterfaceGUID} speichern, aber das tritt nicht auf. Seltsam, dass dieser Mangel an Registrierung die Funktionsfähigkeit der DLL nicht zu beeinflussen scheint, abgesehen von ihrer Auffindbarkeit innerhalb des Referenzdialogs von VB6 und VBA.

Die Eigenschaften für meine .tlb-Datei im Setup-Projekt scheinen korrekt zu sein: Die 'PackageAs' -Eigenschaft ist auf 'vsdpaDefault' gesetzt und die Eigenschaft 'Register' ist auf 'vsdrfCOM' gesetzt. Ich bin verwirrt, warum dies nicht erfolgreich auf dem Zielrechner installiert werden könnte.

Update # 3

Ok, es stellt sich heraus, dass das Setup-Projekt nicht erfolgreich erstellt wird ... obwohl es meldet, dass "Build Succeeded".

Es gibt tatsächlich eine Build-Warnung (erstaunlicherweise eine Warnung, kein Fehler), die als "Kann Registrierungsinformationen für den Dateinamen 'DotNetLibrary3.tlb' erstellen kann" gemeldet wurde. Da dies eine Warnung und kein Fehler war, gab die Kompilierung "Build Succeeded" an und die Fehlerliste wurde nicht geöffnet.

Wenn Sie dies verfolgen, scheint dies ein Problem zu sein, wenn Sie versuchen, ein Setup-Projekt zu erstellen, wenn Vista Ihr Entwicklungscomputer ist, wie hier beschrieben:

COM-Typelib-Registrierungsproblem in VS2008 Setup-Projekt

Es gibt eine etwas manuelle Korrektur, die hier beschrieben wird:

Feedback: Es konnten keine Registrierungsinformationen für die Datei namens "Dateiname" erstellt werden.

Ich habe den Fix noch nicht ausprobiert, aber ich werde es morgen tun und ich werde es melden, wenn es das löst.

Aktualisieren Sie # 4

Das hat nicht so gut funktioniert ... Es scheint, dass das Ausführen von RegCap.exe, wie in diesem Artikel vorgeschlagen, nicht funktioniert, wenn es unter Vista läuft. Da RegCap beim Erstellen der .msi-Datei vom Setup-Projekt selbst intern ausgeführt wird, ist dies nicht besonders überraschend. Kurz gesagt, das Setup-Projekt scheiterte mit hoher Wahrscheinlichkeit, weil der von ihm aufgerufene RegCap-Befehl fehlschlug. Daher hilft das direkte Aufrufen von RegCap nicht.

Die Quintessenz ist, dass dies einfach ein Fehler ist, wenn Sie versuchen, ein Setup-Paket unter Vista zu erstellen. Oder, vielleicht ist es eine Kombination von Visual Studio 2008 und Vista, ich bin mir nicht sicher. Derselbe genaue Ansatz versucht, ein Setup-Projekt auf Visual Studio 2005 zu erstellen, das unter Windows XP läuft, hatte absolut keine Probleme.

Es kann durchaus sein, dass es einige Korrekturen gibt, damit dies unter Vista und / oder Visual Studio 2008 funktioniert, aber ich konnte es nicht finden. Viel effizienter für mich war es, mit Visual Studio 2005 unter Windows XP die COM-Registrierungsanforderungen zu erstellen und sie dann in mein Visual Studio 2008-Setup-Projekt zu importieren.Diese können als .REG-Dateien über regasm mit einem / regfile-Schalter gegen die DLL und mit RegCap (läuft auf W'XP!) Gegen die .tlb-Datei exportiert werden. Da sich meine COM-Schnittstellen nicht ändern, muss ich das nur einmal tun.

Hoffentlich wird dieses Problem in Visual Studio 2008, wenn es unter Vista läuft, irgendwann korrigiert, aber wenn nicht, wird dieser Beitrag hoffentlich für jemand anderen von Nutzen sein, der sich in der gleichen Situation befindet ...

Siehe auch:

Wie bekomme ich COM Server für Excel in VB.NET geschrieben und in der Liste der Automatisierungsserver registriert?

- Mike

    
Mike Rosenblum 23.05.2017, 10:27
quelle

4 Antworten

2

Hat Ihr regasm -Befehl das /codebase -Flag enthalten?

    
jpoh 13.04.2009 02:16
quelle
2

Ich weiß, das war lange her, aber ich kann keine vernünftigen Antworten finden. Ich hatte ein ähnliches Problem und die Lösung bestand darin, Visual Studio als denselben Benutzer auszuführen, der es installiert hat. Wenn ich es als ein anderer Benutzer ausführe, funktioniert alles außer den COM-Registrierungen.

    
John Thewlis 22.09.2011 16:14
quelle
0

Es gibt keine Warnung, wenn Sie VS2008 unter Vista ausführen, aber nicht erhöht . Erhöht ist die Art und Weise, wie wir (Vista-Benutzer) lernen, immer das Ding zu benutzen, aber dafür mag es es aus irgendeinem Grund besser anders.

N.B .: Während der Installationsphase hat mine eine Art von Installation für SQL Server-Tools gestartet, die ich eventuell überstanden habe, aber wenn es nicht erhöht ausgeführt wird, versucht es dies erneut und schlägt mit Berechtigungsproblemen fehl. Es scheint jedoch nicht das tatsächliche Build-Ergebnis zu beeinflussen.

    
Atario 22.07.2009 00:13
quelle
0

Die Registrierungseinträge von Typelib fehlen in der Registrierung. Sie müssen regtlibv12 [path] MyTypeLib.tlb aus dem Microsoft.NET \ framework \ -Ordner für die .NET-Version verwenden, mit der Sie die Assembly erstellt haben. Danach sind die zusätzlichen Registrierungseinträge vorhanden und VBA-Referenzen können sie finden. Alternativ für Windows 10 verwende ich regtlib.exe [Pfad] MyTypeLib.tlb im Windows-Ordner Sie müssen dann die Assembly für Ihr Installationsprogramm erneut erstellen, so dass es nun die Typelib-Einträge enthält. Ich persönlich benutze Wix Installateure und benutze 'Wärme' für diesen Zweck. Regasm / Regfile wird es nicht tun. Verwenden Sie Wärme sowohl für die DLL und die TLB, um die Registrierungseinträge classid und typelib

zu erhalten     
Simon A 23.09.2016 16:36
quelle