2011-02-17 7 views
7

Ev sahibi üzerinde eklenti DLL'lerini bulması gereken bir programım var.Belirli bir arabirime sahip .NET derlemeleri için DLL'leri tarama - bazı DLL'ler R6034'ü atar!

Bu, tüm DLL'leri bir (oldukça büyük) yol içinde numaralandırarak yapar. Bu yol, yerel DLL'ler de dahil olmak üzere pek çok şey içerir.

foreach (var f in Directory.EnumerateFiles(@"c:\Program Files", "*.dll", SearchOption.AllDirectories)) 
{ 
    try 
    { 
     var assembly = Assembly.LoadFile(f); 
     var types = assembly.GetTypes(); 
     foreach (var type in types) 
     { 
      if (type.GetInterface("My.IInterface") != null) 
      { 
       plugins.Add(f); 
       break; 
      } 
     } 
     assembly = null; 
    } 
    catch (Exception e) 
    { 
    } 
} 

benim tarayıcı (örneğin, msvcm80.dll) MS çalışma zamanı DLL Bir uncatchable çalışma zamanı hatası R6034 olsun vurursa: "Bir uygulama yanlış C çalışma zamanı kitaplığı yükleme denemesi yaptı" Bu pencere, programın yürütülmesini engeller. Bu DLL istemiyorum (belli ki); Bu durumdan zarif bir hata elde etmenin bir yolu var mı?

[İlgili q: Bu DLL anda işlem alanına yüklenen değilse bir DLL bir .NET düzeneği olup olmadığını belirlemek için (örneğin, non-istisna) etkili bir yolu yoktur]

cevap

10

İlk önce Assembly.ReflectionOnlyLoadFrom ile yalnızca yansıma yapın. Sadece montajda bir eklenti bulduktan sonra Assembly.LoadFrom ile tamamen yüklemelisiniz.

Diğer sorunuza yanıt vermek için, dosyanın bir CLR üstbilgisine sahip olup olmadığını kontrol edebilirsiniz.

See this post "Read CLR Header" on m.p.dotnet.framework

Birlikte bu eklentileri için arama yaparken özel durumlar ve hata ileti kutularını önlemek izin vermelisiniz.

+1

ReflectionOnlyLoadFrom üzerinde ilginç. Çok kötü, yalnızca belirli bir adın bir derlemesini appdomain'e yüklemekle aynı sınırlamalara sahiptir. Alternatif bir uygulama alanı kullanmak görünüşte olağanüstü derecede acı verici; Başka bir appdomain'i nasıl alacağımı, başarıyla yüklemeleri (belirli türleri dikte etmeden) ve daha sonra bu meclislerin özelliklerini sorgulayan birini bulamadım. Bleah. – Joe

2

Doesn \ Program Files hakkında iyi bir fikir gibi görünmüyor ... Birisi oraya kötü niyetli DLL'ler koyabilir mi?

MEF kullanıyor musunuz? Ayrıca biraz daha güvenli olabilir.

Sizin için derlemeleri otomatik olarak yükleyecek ve size bir arabirim dizisi döndüren bir DirectoryCatalog var.

Dependency Injection veya (IoC) Inversion of Control hakkında bilgi sahibi olduğunuzdan emin değilsiniz, ancak bunun için MEF'yi de kullanabilirsiniz.

.Net 4.0'da bulunur.

+0

İlginç. Umut verici görünüyor, teşekkürler. – Joe

+2

Tamam, bu çok saçma. MEF aynı sorunu gösterir. MEF'ye, VC++ çalışma zamanı kitaplıkları içeren bir dizinde DirectoryCatalog kullanmasını söylerseniz, aynı R6034 açılır penceresini alırsınız. (Ayrıca, DirectoryCatalog dizin yinelemeyi desteklemez, bu nedenle de istediğiniz tüm dizinleri numaralandırmanız gerekir.) MEF soyutlamasını seviyorum ama maalesef sorunu çözmüyor. – Joe

+0

Biliyor musunuz; 1) MEF, tüm katalogları verilen katalogdan yükler ve daha sonra verilen tiplere filtre uygular veya 2) Assembly.ReflectionOnlyLoad yöntemini çağırır, süzer ve sonra yükler? –

İlgili konular