2009-07-21 15 views
10

Depo dizininde olduğunu bildiğim bir kitaplık için "Foo.dll" gibi bir dosya adı var. Bunun için bir Assembly nesnesi oluşturmak istiyorum. Bu nesneyi sayfa olmayan bir sınıftan başlatmaya çalışıyorum, bu yüzden yolu almak için Request nesnesine sahip değilim. Assembly.Load() kullanmak için gereken yolu nasıl alabilirim?Bir derlemeyi ASP.NET'teki Bininden Yükle

cevap

15

Assembly.Load bir dosya yoluna gerek duymaz, bunun yerine AssemblyName gerektirir. Derlemenizin standart arama yolunda (yani, bin dizini) olduğunu biliyorsanız, derlemenin disk yolunu bilmeniz gerekmemelidir ... yalnızca derleme adını bilmeniz gerekir. senin toplanma durumunda, sizi varsayarak, derleme adı sadece "Foo" olmalıdır vb belirli bir sürümünü, kültür, gerek yok:

Assembly fooAssembly = Assembly.Load("Foo"); 

belirli bir sürümünü yüklemek için gerekiyorsa, size

Assembly fooAssembly = Assembly.Load("Foo, Version=1.1.2, Culture=neutral"); 

Genellikle, Assembly.load yerine Assembly.LoadFrom veya Assembly.LoadFile kullanmak istediğiniz: aşağıdaki yapardı. LoadFrom ve LoadFile, standart füzyon işleminin dışında çalışır ve derlemelerin birden fazla yüklenmesine, güvenli olmayan konumlardan vb. Yüklenmesine neden olabilir. Assembly.Load, bin, GAC gibi standart montaj konumlarını arayarak bir "standart" yük gerçekleştirir. vb. ve tüm standart güvenlik kontrollerini uygular.

+2

alternatif olarak eğer bu montajda bir tipte bir nesneye sahipseniz, aşağıdaki gibi bir şey yapabilirsiniz: obj.GetType(). –

2

Assembly.LoadFile (...) çalışır mı?

+0

Mutlak yolu biliyorsanız, emin olun. Sanırım sorunun önemli kısmı bu. –

1

Tanımınıza göre, bu bir web uygulaması gibi geliyor, bu nedenle bir istekte bulunmayan bir eşzamansız iş parçacığına sahip değilseniz, HttpContext erişiminiz olmalıdır. Buradan ihtiyacınız olan dosyaya Server.MapPath()'u kullanabilirsiniz.

0

Kullanıyorsa, kullanmam için tam bir örnek.

[TestMethod()] 
public void ReadAssemblyResourceFileTest() 
{ 
    var res = SetupEngine.ReadAssemblyResourceFile("newdb.sql"); 
    Assert.IsNotNull(res); 
} 

ps: Kaynaklar DLL Kütüphanesi (Kurul) kök altındaki bir klasör

 public static string ReadAssemblyResourceFile(string resourcefilename) 
     { 
using (var stream = Assembly.Load("GM.B2U.DAL").GetManifestResourceStream("GM.B2U.DAL.Resources." 
    + resourcefilename))   { 
        if (stream == null) throw new MyExceptionDoNotLog($"GM.B2U.DAL.Resources.{resourcefilename} not found in the Assembly GM.B2U.DAL.dll !"); 
        using (var reader = new StreamReader(stream)) 
        { 
         return reader.ReadToEnd(); 
        }   
       } 
     } 

işlevini aramak. "Oluştur eylemi", her kaynak dosyasının "Gömülü Kaynak" (özellikler penceresinde) olarak işaretlemeyi unutmayın.

İlgili konular