2013-04-02 13 views
5

Ich habe ein paar Änderungen in ausgewählten DLLs freizugeben (einfache Änderungen interne Verfahren - nichts, was die Kompatibilität nach this bricht)VB6 - Freigabe nur wenige DLLs starke Abhängigkeit, ohne irgendwelche Referenzen zu brechen

So ist die Regel Die akzeptierte Methode besteht darin, die alten DLLs in einem separaten freigegebenen Verzeichnis zu verwalten und sie während der Erstellung der neuen DLLs mit Binärkompatibilität zu kompilieren, die auf die alten DLLs festgelegt ist. Dies geschieht, um die GUIDs nicht zu ändern, während ich meine neuen DLLs registriere. Diese GUIDs werden als Referenzen in anderen DLLs verwendet, die ich während der Veröffentlichung nicht gestört habe.

Jetzt, wenn ich versuche, eine der neuen DLL zu machen, erhalte ich eine Warnung: "Die Binärkompatibilitäts-DLL oder EXE enthält einen Parametertyp oder Rückgabetyp, dessen Definition nicht gefunden werden kann." Ich bin mir ziemlich sicher, dass ich nichts hinzugefügt habe, um die Binärkompatibilitätsregel zu brechen (keine Änderung in der Signatur, öffentlichen Methoden, Variablen usw.). Bin ich ein Noob, indem ich etwas Grundlegendes nicht überprüfe?

Kratzen mein Kopf seit dem Morgen. Jede Hilfe wird sehr geschätzt.

EDIT: Wenn überhaupt gibt es Änderungen an meiner Unterschrift, gibt es eine Möglichkeit, die ich kennen kann, ohne Code zu vergleichen?

+1

Es ist möglich, dass Ihr Code früher Kompatibilitätsprobleme hatte. VB6 warnt nicht, wenn Sie eine neue öffentliche Methode oder Eigenschaft hinzufügen, aber nachfolgende Kompilierungen erzeugen unterschiedliche Typelibs - weil Ihre Referenz-DLL diese neue Methode noch nicht enthält. (Ich setze oft Dll-Kompatibilität zu dll selbst.) Ich denke (aber nicht erlebt), dass bestimmte Nachricht (... Definition kann nicht gefunden werden) kann einige Änderungen in Projektreferenzen zeigen oder Sie haben eine andere Komponente deinstalliert/nicht registriert von Ihrem System. – Arvo

+2

Ihr binäres Kompatibilitätsziel verwendet Typen von externer typelib (wahrscheinlich ein anderes VB6-Projekt), das nicht korrekt auf dem Buildcomputer registriert ist oder eine neue/alte inkompatible Version ist. – wqw

+0

@Arvo - Ja, es ist möglich, dass der Code früher brach. In diesem Fall sollte es mindestens zwei typelibs geben (eine für vor der Pause und eine für nach). Aber meine Registrierung enthält nur eine – maverick

Antwort

2

Nehmen Sie Ihre alten DLLs und fügen Sie ihnen ein compat_ Präfix hinzu.

Im Grunde benennen Sie Ihre MyAppDataAccess.dll Datei in compat_MyAppDataAccess.dll um.

Gehen Sie nun zu den Eigenschaften Ihrer ActiveX-DLL und stellen Sie Ihr Projekt binäre Kompatibilität mit der neuen compat_MyAppDataAccess.dll, wie unten.

Jetzt nur Ihre DLL erstellen und bereitstellen.

Es sollte funktionieren. Wenn Ihre Binärkompatibilität als Ergebnis Ihrer Änderungen tatsächlich aufgehoben wird, erhalten Sie eine entsprechende Warnung.

enter image description here

+0

Wäre das nicht so, als referenziere man dieselbe DLL selbst? Nicht sicher, ob das ein guter Weg ist. Hört sich gruselig an. Muss ich nicht beide registrieren? – maverick

+0

Eigentlich, ja, aber warum wäre es gruselig? Sie müssten nicht beide registrieren. Das 'compat_' dient nur dazu, Binärkompatibilität zu bieten - Sie müssen es nicht verteilen. Ich habe eine Menge VB6-Apps, die eine Menge Bibliotheksabhängigkeiten haben, und dies ist eine einzige Möglichkeit, sicherzustellen, dass die Bibliotheken die Binärkompatibilität nicht unterbrechen. – AngryHacker

+0

Ok! Das funktioniert. Ich habe einen separaten Ordner für meine kompatiblen DLLs an einem freigegebenen Speicherort erstellt. Ich akzeptiere die Antwort, da sie mein Problem gelöst hat. Vielen Dank – maverick