2011-12-15 29 views
10

Projemin bir parçası olan çeşitli sınıf kitaplıklarını kullanan bir projem var, önce AssemblyA yüklenir, sonra AssemblyB yüklenir.derleme yükünü geçerli etki alanına zorlamak için doğru bir yol

var x = typeof(AssemblyB.AssemblyB_Type); 
: AssemblyA yılında AssemblyB yüzden şu gereksiz şey yapıyorum derleme yükleme, currentDomain içine henüz yüklü değil, AssemblyA bunu çalıştığında aşağıdaki

var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
var assemblyB = assemblies 
       .Where(x=>x.GetName() == "AssemblyB") 
       .First(); 
var type = assemblyB.GetType("AssemblyB_Type"); 

Maalesef yapan kod vardır

Derleyici, bu satırın gerekli olmadığına dair uyarı gösteriyor, aksi halde işe yaramayacağını anlatacak kelimeler bulamıyorum, bu yüzden soru şu olurdu: (Feng Shui terimleriyle) doğru şekilde nasıl doğrularsınız? Ekstra-sıhhi tesisat tesisatı yapmadan CurrentDomain içine yükleme

+1

sadece Assembly.load() kullanın. Veya CLR'nin derlemeyi otomatik olarak yüklemesini sağlamak için var type = typeof (NamespaceNameInAssemblyB.AssemblyB_Type) kullanın. –

+0

Sanırım biraz kafam karıştı. Eğer typeof (AssemblyB.AssemblyB_Type) yapabiliyorsanız, neden assemblyB.GetType ("AssemblyB_Type") yapmalısınız? –

+1

Üçüncü taraf bir JInt kitaplığı var (JavaScript yorumlayıcısı). JavaScript kaynağından CLR türlerinin bağlanmasına izin verir. İlk önce AppDomain.CurrentDomain.GetAssemblies() kullanır ve sonra bu derleme uygun derlemeyi bulmaya çalışır, eğer derlemem C# koduna dokunmadıysa, CurrentDomain'e yüklenmez ve JavaScript'den erişilemez ... – Lu4

cevap

8

Varolan kodunuz bunu yapmanın en iyi yoludur (AFAIK).

uyarı kurtulmak için, başvurulan derlemeler doğru dağıtıldığı takdirde onun türlerinden birini çağırırsanız, onlar "sadece yük" gerektiğini

typeof(AssemblyB.AssemblyB_Type).ToString(); 
+0

Bu yazık :(korkunç görünüyor ... – Lu4

3

olarak değiştirin. .NET framework sizin için bununla ilgilenmelidir.

Burada yol açıklayan iyi bir makale sizin başvurulan derlemeler için çerçeve arar: http://msdn.microsoft.com/en-us/library/yx7xezcf(v=vs.71).aspx

Sana böyle zamansız bir derleme yüklenemedi gerektiğini ne yaptığını merak ediyorum?

Doğrudan sorunuzu cevaplamak için kullanılan bir hack, Assembly.Load (string location) kullanmaktır - ancak kesinlikle gerekli olmadıkça bunu cesaretlendirmekteyim. http://msdn.microsoft.com/en-us/library/ky3942xh.aspx

+0

Bir 3. parti JInt kütüphanesi (JavaScript yorumcu) var.JJJ kaynağından bağlama CLR türleri sağlar.İlk olarak 'AppDomain.CurrentDomain.GetAssemblies() 'kullanır ve sonra bulmaya çalışır Bu mecliste uygun tipte, derlemem C# koduna dokunmadıysa, CurrentDomain'e yüklenmedi ve JavaScript'den erişilemiyor ... – Lu4

+0

Gotcha. Hiçbir şey kafamdan atlamıyor - Bunu düzeltmek için güzel ve dinamik bir yol AppDomain.CurrentDomain.GetAssemblies() numaralarını numaralandırmak ve referans olanları derleyen tüm derlemeleri yüklemek olacaktır. Bu bellek ve başlatma performans sorunları neden olabilir - ama bence tamam olması gerektiğini düşünüyorum. "Assembly.GetR eferencedAssemblies() "http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getreferencedassemblies.aspx – Dlongnecker

+0

Burada bir şey garip geliyor, sanırım daha iyi bir çözüm var ama JInt için değişiklikler içerebilir .... – Dlongnecker

1

Böylece, tüm dizini bin dizininizde uygulama etki alanına yükleyebilirsiniz. Bu probleminizi çözmeli.

var assemblies = Directory.GetFiles(containingDirectory, "*.dll")' 

foreach (var assembly in assemblies) 
{ 
    Assembly.Load(AssemblyName.GetAssemblyName(assembly)); 
} 
+0

Yalnızca, nerede çalıştırıldığı hakkında varsayımlarda bulunduğunda çalışır. Örneğin, kodunuz IIS veya bir birim test koşucusu gibi farklı bir ana bilgisayarda çalışırken çalışmaz. – nathanchere

1

Benim yaptığım şudur: daha sonra talep üzerine bir derleme yüklemek isterseniz

public static class TypeExtensions { 
    public static void EnsureAssemblyLoads(this Type pType) { 
     // do nothing 
    } 
} 

... 

typeof(SomeType).EnsureAssemblyLoads(); 
İlgili konular