Ich habe vor kurzem eine Frage über statische und dynamische Verknüpfungen gelesen, die mich an einige Fragen erinnert haben, die ich darüber hatte. Von diesem Beitrag kann ich sehen, was der technische Unterschied ist (einschließlich Objektdateiinhalte direkt, anstatt nur darauf zu zeigen), aber ich würde gerne ein bisschen mehr über die Vor- / Nachteile wissen, dies zu tun.
Vor einiger Zeit beklagte ein Freund von mir, der mehrere Jahre programmiert hat, dass C # nicht statisch verknüpft ist, und sagte, dass dies das Feature sei, das er am meisten für eine zukünftige Version wünschte. Leider bin ich ein Neuling und verstehe diese Aussage nicht wirklich.
Danke für jede Erleuchtung!
Ich bin mir nicht sicher, ob eine statische Verbindung in C # wirklich eine gute Idee ist, um ehrlich zu sein, aus einer Million Gründen. Ein Grund dafür ist, dass C # im Gegensatz zu Sprachen wie C oder C ++ das Konzept von Assemblys hat, bei denen es sich im Wesentlichen um ausführbare Dateien oder DLLs handelt.
Wenn Sie nun Dinge in .NET statisch verlinken wollen, haben Sie entweder
Ich bin mir sicher, dass es eine clevere Möglichkeit gibt, diese Probleme zu vermeiden, aber ich verstehe nicht, wie man statisch in einer verwalteten Umgebung wie .NET oder Java verlinkt. Ich meine, statische Verknüpfungen verbessern zwar die Performance, aber nicht so sehr. Und wir verwenden keine verwalteten Sprachen für ihre Ausführungsgeschwindigkeit sowieso.
Ein weiteres Problem ist die DLL-Hölle, aber in .NET ist das sowieso schon ein Problem.
Der Vorteil der statischen Verknüpfung besteht darin, dass die externe Abhängigkeit von Bibliotheken aufgehoben wird. Das Verhalten der verwendeten Bibliothek wird sich nie ändern, weil jemand die Bibliothek auf der Festplatte geändert hat. Das ist auch einer der Nachteile der statischen Verknüpfung; Wenn sich das Betriebssystem ändert und eine neue Version der Bibliothek benötigt wird, um damit ordnungsgemäß zu arbeiten, müssen Sie eine aktualisierte Version Ihrer Binärdatei bereitstellen. Wenn Sie der Bibliothek einen Bugfix hinzufügen, erhalten Sie diese Fehlerbehebung nicht automatisch, wenn Sie eine statische Verknüpfung haben.
Die meisten (wahrscheinlich sogar alle diese Tage) Betriebssysteme können eine Kopie einer dynamischen Bibliothek für mehrere Prozesse laden, weshalb sie unter UNIX als gemeinsame Objekte bezeichnet werden.
Eine statisch ausführbare Datei enthält alle Objekte, die sie benötigt, damit bei der Ausführung keine externe DLL aufgerufen wird. Der Vorteil ist, dass es auf vielen Plattformen portabel ist, egal welche Version von DLLs auf diesem System installiert sind. Der große Nachteil ist, dass Sie wahrscheinlich Speicherplatz verschwenden, da Sie in Ihren ausführbaren Code, der bereits in System / externen DLLs vorhanden ist, enthalten. Außerdem denke ich, aber ich bin mir nicht sicher, dass DLLs nur einmal in den Hauptspeicher geladen werden, egal wie viele ausführbare Dateien sie verwenden, aber wenn Sie die Bibliotheksobjekte innerhalb Ihrer ausführbaren Datei statisch verknüpfen, laden Sie den gleichen Code zweimal für die DLL, die von den restlichen Programmen verwendet wird, und für die ausführbare Datei. Auf der anderen Seite könnte dies ein Vorteil sein, aber ein Nachteil, da die ausführbare Datei nur die Objekte der externen Bibliotheken enthält, die sie benötigt, nicht die gesamte Bibliothek. Eine DLL wird im Speicher als Ganzes geladen, wenn eine Anwendung es benötigt.
Die statische Verknüpfung ist ideal, um kleine Apps zu kompilieren, die Sie als kleines Tool von einem System zum anderen transportieren möchten. I.e. Es war wirklich nützlich für mich, eine statisch kompilierte Version von tcpdump zu haben, wenn sie nicht in jeder Linux Distribution enthalten war. Es musste mit jedem Linux funktionieren, egal welche Version von Kernel, glibc oder anderen Systembibliotheken es hatte. Vielleicht hat es in Windows-Welt nicht so viel Sinn, da die Plattformen viel homogener sind. Wenn Sie für Windows XP / NET vX.X kompilieren, funktioniert es auf vielen Computern. Wenn Sie etwas für Debian X.X kompilieren, wird es sicher nicht mit älteren / neueren Debianern oder anderen Distributionen wie Redhat funktionieren.
Dieser Thread kann auch Ihre Fragen lösen.
Alle benötigten Materialien sind in eine ausführbare Datei gepackt. Also,
Natürlich wird die Größe der ausführbaren Datei erhöht, aber sie sollte kleiner sein als ein Haufen dummer Grafikdateien.
Es gibt ein gutes Beispiel für den Unterschied zwischen statischer und dynamischer Verknüpfung. Wenn Sie sich das InkScape-Projekt ansehen, finden Sie InkscapePortable und InkScape. InkscapePortable wird von einem USB-Stick ausgeführt. InkScape wird nicht.