Wie verwende ich Reg-Free COM für eine VB6 DLL-Referenz in einem .net-Projekt?
-
03-07-2019 - |
Frage
Ich habe versucht, dieses Problem für eine lange Zeit zu lösen, und nichts scheint zu funktionieren.
Ich habe einen COM-DLL in VB6 geschrieben. Ich füge einen Verweis auf diese DLL in .net, mit den ‚isoliert‘ und ‚Kopie lokalen‘ Eigenschaften auf true gesetzt auf der Referenz. Offenbar soll dies reg frei com ermöglichen.
Aber es funktioniert nicht. Wenn ich auf einem anderen Computer versuchen, oder die DLL mit Regsvr32 deregistrieren, versuchen die DLL löst eine Ausnahme für den Zugriff auf (im Wesentlichen sagt die gewünschte com-Klasse nicht existiert). Die DLL und Manifest-Dateien sind im selben Ordner wie die EXE, aber es scheinbar einfach total ignoriert sie.
Was mache ich falsch? Ich habe eine Tonne Streuartikel über diese Zeilen lesen, aber keiner von ihnen geben Sie mir eine funktionierende Lösung. Ich habe mit Visual Studio ohne Erfolg gebastelt. Ich habe eine kleine Menge mit Make-my-Manifest gebastelt, aber es hat nicht funktioniert (auch auf einem Testprojekt).
Lösung
Ich war die Erstellung und Verwendung der COM-Klasse auf einem Nicht-UI-Thread. Offenbar Reg-Free com auf VB6 DLLs funktioniert nicht in dieser Situation. Dieser Test Code zeigt es:
Private Sub RunTest() Handles Button1.Click
Try
Dim x As New RegTestProject.RegTestCall
MsgBox(x.RegTestFunction())
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
Private Sub RunThreadedTest() Handles Button2.Click
'fails if reg-free COM is used'
Dim t As New Threading.Thread(AddressOf RunTest)
t.Start()
End Sub
Wenn ich dies mit dem DLL normalerweise registriert laufen, folgen beiden Tests. Wenn ich reg frei com verwenden, schlägt der Gewinde Test, obwohl der normale Test erfolgreich ist nach wie vor. Sieht aus wie das wird einen großen Schmerz sein, um herum zu arbeiten.
Andere Tipps
Ich bin mir ziemlich sicher, dass, wenn Sie COM-Komponenten auf diese Weise der COM-Komponente Import Referenz jedes Mal passiert, Sie zu bauen. Das bedeutet, dass die COM-Komponente muss die traditionelle Art und Weise registriert werden, auf jeder Maschine wird das Projekt gebaut auf.
Hier ist ein Link rel="nofollow die Registrierung unter Verwendung beschreibt kostenlos com-Interop. Wenn Sie bereits getan haben dies bitte Ihre Manifest-Datei schreiben. Vielleicht haben Sie einen Tippfehler haben Ihr fehlt.
Bearbeiten
Nur ein Gedanke könnte einfacher sein, nur um die DLL zum ersten Mal registriert die App auf eine neue Maschine laufen. Die Registrierung ist kostenlos com interopt ist nur unter Windows XP und höher also, wenn Ihr alle Dinosaurier Targeting da draußen wird es nicht funktionieren.
Hier ist ein Auszug aus der Fehlerbehebung Abschnitt einer MSDN Artikel auf reg frei COM. Entschuldigt, wenn Sie haben es schon gesehen. Die gute Nachricht: Sie sind bereits Teil des Weges durch die einzelnen Schritte. Er schlägt vor, das Problem in Windows Server 2003 Wiedergabe von (vielleicht mit Virtual PC ?) und dann sollte das Ereignisprotokoll helfen.
Zuerst sollten Sie ... Ihr Kunde arbeitet mit einen registrierten Server; dann deregistrieren der Server und stellen Sie sicher, dass Ihre Fehler Nachricht ist, was Sie erwartet; und schließlich ... Handwerk und bereitstellen manifest Dateien. Auf diese Weise Ihre Fehlerbehebung Bemühungen ... wird auf das beschränkt werden, Struktur Ihrer Manifest-Dateien (und Die korrekte Einbettung des Montage manifestieren, wenn Sie sich dazu entscheiden, dies zu tun).
Bei der Fehlerbehebung Anmeldung frei COM Fragen, die Ereignisanzeige auf Windows Server 2003 ist dein Freund ... Blick in dem Systemereignisprotokoll für Ereignisse aus dem COM-Server. Ich schlage vor, Sie nicht, dass Sie das sehen Windows XP Ereignisprotokoll ... es wird immer ein enthalten Nachricht ..., die nicht hilft das Problem identifizieren.