2016-04-13 17 views
2

Yönetilmeyen bir dll adını veren bir C# kod parçam var.Bir dll'nin varlığı nasıl sağlanır

[DllImport("urlmon.dll", CharSet = CharSet.Ansi)] 
private static extern int UrlMkSetSessionOption(int dwOption, string pBuffer, int dwBufferLength, int dwReserved); 

Bu kod, geniş bir kitleye hedefleme Başka bir uygulamada kullanılacak bir pencere şekilleri kontrol çözeltisi bulunmaktadır. Anlıyorum gibi

, DllImport özellik, sistem üzerinde bir dll arar ve bulursa, çiftleri buna extern fonksiyonu (çoğunlukla biliyorum C extern işleri).

Bu dll'nin kullanıcının sisteminde bulunmasını nasıl sağlayabilirim? Uygulamamla birlikte paketlemeli miyim (Bunu nasıl yapacağımı biliyorum)? Windows * 'a eklendiği için var olacağından emin misiniz?


Ben birçok uygulama nedeniyle Windows XP ve daha eski eksik dlls çökmesini gördüm, o yüzden buna argüman güvenmiyorum *.

+1

Bu soruyu kontrol ettiniz mi? http://stackoverflow.com/questions/2292578/check-if-a-dll-is-present-in-the-system Kabul edilen cevap, kullanıcının makinesinde DLL bulunup bulunmadığını kontrol etmek için kullanabileceğiniz kodu içerir. – Alex

+0

Bu, XP'den başlayarak, [MSDN'de Windows/IE'nin bir parçası olarak belgelenen] işlevinin (https://msdn.microsoft.com/library/ms775125) özel bir durumudur. Kodunuzun, desteklenmeyi bıraktığı uzun süredir Windows sürümlerini çalıştırmayı beklemediğiniz sürece, bu * özel * işlevinin her zaman mevcut olması beklenebilir (ve bunun için ayrı ayrı denetleme hiçbir şey eklemez). * Genel * soru daha fazla dahil. –

cevap

1

DLL dosyasının var olduğundan emin olmak için sorumlu taraf olduğunu söyleyebilirim, ancak uygulamanız yükleyiciniz! Uygulamanızın çalıştığı zamanda bağımlılıklar konusunda endişelenmek için çok geç. Ancak, yükleyici bittiğinde daha 'zarif' başarısız olmak istiyorsanız, aşağıdakiler yararlı olabilir. Görüşme başarılı olursa, kontrol etmek istediğiniz şey aslında budur. İçe aktarılan işlevi bir try-catch bloğunda çağırmayı ve aramanın başarılı olup olmadığını görmeyi deneyebilirsiniz. Tabii

bool available = true; 
try { 
    UrlMkGetSessionOption(...test parameters...); 
} 
catch (DllNotFoundException) 
{ 
    available = false; 
} 
catch (EntryPointNotFoundException) 
{ 
    available = false; 
} 

bu sadece: DLL bulunamadı Eğer DLL bulunursa ancak How do I handle a failed DllImport? üzerinde Yanıt başına, sonra bir EntryPointNotFoundException atılır işlevi yoksa, bir DllNotFoundException atılmış, ve DLL, test parametreleriyle çağırmanıza olanak veren bir işlevi varsa çalışır; URLMon durumunda, örnekte gösterildiği gibi iyi bir işlev UrlMkGetSessionOption olacaktır. Eğer buna sahip değilse, ama ilk çağrıldığında, ilk aramayı bir testte sarabilirsiniz.

Ancak, diğer yandan, DLL bulunmuyorsa, programınızı makul olarak ne yapabilirdi? Bunu kullanan isteğe bağlı bir özellikse, bunu devre dışı bırakabilirsiniz, ancak genellikle DLL/işlev yoksa, programınız çalışmaz. Sanırım bunun için kullanım, daha sonra başarısız olmak yerine hızlı ve öngörülebilir bir şekilde dostça bir hata mesajı ile başarısız olmaktır.

+0

Teşekkürler, tam olarak aradığım şey bu. Tıkırtıyı kullanacaktım, bu yüzden yükleyicinin sistemden ne istediğini çok fazla kontrol etmiyorum, ancak bunu yapılandırabilirim. –

İlgili konular