Ich würde sagen, die primäre verantwortliche Partei für die Gewährleistung, dass die DLL existiert, ist nicht Ihre Anwendung, sondern Ihre Installer! Zu dem Zeitpunkt, zu dem Ihre Anwendung ausgeführt wird, ist es zu spät, sich um Abhängigkeiten zu kümmern. Wenn Sie jedoch "eleganter" ausfallen möchten, wenn das Installationsprogramm verpfuscht ist, könnte Folgendes nützlich sein.
Was Sie überprüfen möchten, ist tatsächlich, wenn der Anruf erfolgreich ist. Sie können einfach versuchen, die importierte Funktion in einem try-catch-Block aufzurufen und zu überprüfen, ob der Aufruf erfolgreich ist. Wenn die DLL nicht gefunden wurde, wird ein DllNotFoundException
geworfen, und wenn die DLL gefunden wird, aber nicht die Funktion dann ein EntryPointNotFoundException
geworfen wird, gemäß der Antwort auf How do I handle a failed DllImport?:
bool available = true;
try {
UrlMkGetSessionOption(...test parameters...);
}
catch (DllNotFoundException)
{
available = false;
}
catch (EntryPointNotFoundException)
{
available = false;
}
Natürlich ist dies nur funktioniert, wenn die DLL über eine Funktion verfügt, mit der Sie sie mit Testparametern aufrufen können; Im Fall von URLMon wäre eine anständige Funktion UrlMkGetSessionOption
, wie in dem Beispiel gezeigt. Wenn dies nicht der Fall ist, aber Sie wissen, wann es zum ersten Mal aufgerufen wird, können Sie den ersten Anruf in einem Test umbrechen.
Aber auf der anderen Seite, was könnte Ihr Programm vernünftigerweise tun, wenn der DLL nicht vorhanden ist? Wenn es ein optionales Feature ist, das das verwendet, könnten Sie es deaktivieren, aber normalerweise, wenn das DLL nicht vorhanden/funktionsfähig ist, kann Ihr Programm nicht funktionieren. Ich nehme an, dass die Verwendung dafür schnell und vorhersehbar mit einer freundlichen Fehlermeldung fehlschlägt, anstatt später zu versagen.
Haben Sie diese Frage gecheckt? http://stackoverflow.com/questions/2292578/check-if-a-dll-is-present-in-the-system Die akzeptierte Antwort enthielt Code, den Sie zur Überprüfung, ob DLL vorhanden auf dem Computer des Benutzers verwendet werden können. – Alex
Dies ist ein besonderer Fall einer [Funktion in der MSDN dokumentiert als Teil von Windows/IE] (https://msdn.microsoft.com/library/ms775125) ab XP. Sofern Sie nicht erwarten, Ihren Code auf Windows-Versionen auszuführen, die seit langem nicht mehr unterstützt werden, kann erwartet werden, dass diese * particular * -Funktion immer vorhanden ist (und die separate Suche nach nichts fügt hinzu). Die * allgemeine * Frage ist komplizierter. –