2016-04-13 26 views
2

Ich habe ein Stück C# -Code, der eine unmanaged DLL aufruft.So stellen Sie sicher, dass eine DLL vorhanden ist

Dieser Code ist in einer Windows Forms-Steuerungslösung enthalten, die in einer anderen Anwendung verwendet wird, die auf eine große Zielgruppe ausgerichtet ist.

Wie ich verstehe, das DllImport Attribut, sucht nach einer DLL auf dem System, und wenn gefunden, Paare die extern Funktion, um es (ich meistens wissen, wie extern Werke in C).

Wie kann ich sicherstellen, dass diese DLL auf dem System des Benutzers gefunden wird? Sollte ich es mit meiner Anwendung bündeln (ich weiß, wie das geht)? Ist es sicher, dass es existiert, wie es in Windows * enthalten ist?


* Ich habe wegen der fehlenden DLLs in Windows XP viele Anwendungen Absturz gesehen und älter, so dass ich nicht wirklich dieses Argument vertrauen.

+1

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

+0

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. –

Antwort

1

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.

+0

Danke das ist genau das, was ich gesucht habe. Ich wollte clickonce verwenden, daher habe ich nicht so viel Kontrolle darüber, was der Installer vom System benötigt, aber ich kann das konfigurieren. –

Verwandte Themen