Dies ist ein Standard-DLL-Hell-Problem, das durch die Verwendung der Option/codepage für Regasm.exe verursacht wird. Oder häufiger das Register "Projekt> Eigenschaften> Erstellen"> "Für COM-Interop registrieren". Beide machen das gleiche, sie schreiben den Pfad zur DLL in die Registry. Es ist eine sehr gute Option zu verwenden, wenn Sie mit der Entwicklung und dem Testen des Projekts beschäftigt sind, es vermeidet, die DLL in dem GAC jedes Mal neu zu registrieren, wenn Sie eine Änderung vornehmen.
Aber was es tut nicht tun, ist die CLR helfen, Abhängigkeiten zu finden. Die normalen Prüfregeln bleiben in Kraft. Sie suchen nach einer Datei namens appname.exe.config in dem Verzeichnis, in dem die EXE gespeichert ist. Und zuerst schaut im GAC, als nächstes im EXE-Pfad nach Abhängigkeiten. Die Konfiguration bleibt unter der Kontrolle des üblichen Opfers von DLL Hell, wer die EXE behalten muss. Häufig der Endbenutzer. Also, explizit, es tut nicht in das Verzeichnis suchen, in dem Ihre [ComVisible] DLL gespeichert ist.
Es ist die milde Art von DLL Hell, nur eine einfache Datei-nicht-gefundenen Missgeschick. Viel milder als die böse Art, eine Datei mit dem richtigen Namen, aber der falschen Version zu finden. Im Allgemeinen ein starkes Problem mit Newtonsoft.Json.dll gibt es etwa 35 Versionen in freier Wildbahn. Wenn man so viele Versionen hat und es so eine populäre Bibliothek ist, erzeugt man auch die andere Art von Boshaftigkeit, wobei das Programm einen anderen COM-Server benutzt, der auch die DLL benutzt. Aber fast zwangsläufig eine andere Version. Tendiert dazu, lange nachdem Sie Ihr Projekt beendet haben. Einer von ihnen wird verlieren, 50-50 Chancen, dass Sie es sind. 100% Quoten für den Endnutzer.
Ja, die GAC löst dieses Problem. Jede Bibliothek erhält die gewünschte Version. Im Idealfall löst Newtonsoft dieses Problem mit einem Installer, der die DLL in den GAC implementiert. Aber es ist nicht die Art von Engagement, die Open-Source-Bibliotheksautoren jemals bieten möchten. Sie wollen (und müssen) es zu Ihrem Problem machen. Microsoft tut dies, aber sie haben auch Windows Update, um sicherzustellen, dass kritische Bug- und Sicherheitsfixes bereitgestellt werden. Und eine große Anzahl von Leuten arbeitet daran, sicherzustellen, dass alle neuen Versionen immer abwärtskompatibel zur ursprünglichen Version sind, so dass sich die Versionsnummer nicht ändern muss.
Beachten Sie, dass Sie können Vorteil von Microsofts Engagement nutzen. Sie können auch die Klassen DataContractJsonSerializer und JavascriptSerializer verwenden, um diese Aufgabe zu erledigen. Teil des Rahmens, sie verstehen es selten falsch.
Unterdessen beachten Sie, dass nur ein Datei-nicht-gefunden-Problem ist.Sie müssen den GAC nicht auf Ihrem Dev-Computer verwenden, und es ist besser, wenn Sie es nicht tun, ist es genauso einfach, die Datei an den richtigen Ort zu kopieren, um die CLR glücklich zu machen. Welches ist das gleiche Verzeichnis wie Ihr VB6-Testprogramm. Und, zusätzliche Eigenart mit VB6, in C: \ Programme (x86) \ Visual Studio \ VB6, wenn Sie den VB6-Debugger verwenden möchten. Verwenden Sie den GAC beim Bereitstellen.
Es ist also nicht Json.Net, das Sie in COM registriert haben, aber eine andere .Net-Assembly, die Json.Net verwendet? – Liam
Kommt dieser Fehler von Ihrer C# Interop-Assembly? Sie möchten etwas wie Process Monitor verwenden, um genau zu beobachten, wo Ihre Anwendung sucht, wenn es versucht, die Newtonsoft.Json.dll-Datei zu finden. –
@Liam Ja. Die COM-Interop-DLL verwendet die standardmäßige Newtonsoft.Json-Assembly. –