2011-12-15 38 views
10

我有一個使用幾個類庫的項目,這些類庫是我的項目的一部分,首先AssemblyA被加載,然後AssemblyB被加載。在AssemblyA存在代碼執行以下操作強制彙編載入當前域的正確方法

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

不幸的是,當AssemblyA試圖做到這一點,AssemblyB是尚未加載到CurrentDomain,所以加載組件我做下面的事情沒有必要:

var x = typeof(AssemblyB.AssemblyB_Type); 

編譯器顯示警告,這一行是不需要的,雖然我找不到解釋它的單詞,否則它將無法正常工作,所以問題是,你如何正確地(以風水術語)強制裝配加載到CurrentDomain而不會做無用的管道工程

+1

如果要按需加載的程序集就用Assembly.Load()。或者使用var type = typeof(NamespaceNameInAssemblyB.AssemblyB_Type)讓CLR自動加載程序集。 – 2011-12-15 22:25:03

+0

我想我有點困惑。如果你能夠做typeof(AssemblyB.AssemblyB_Type),那麼爲什麼你需要做assemblyB.GetType(「AssemblyB_Type」)? – 2011-12-15 22:33:36

+1

還有第三方JInt庫(JavaScript interpriter)。它允許從JavaScript源內綁定CLR類型。首先它使用AppDomain.CurrentDomain.GetAssemblies(),然後它會嘗試在該程序集中找到適當的類型,如果我的程序集未被C#代碼觸及,則它不會加載到CurrentDomain,並且無法從JavaScript訪問... – Lu4 2011-12-16 13:15:34

回答

8

您現有的代碼是實現這一目標的最佳方式(AFAIK)。

爲了擺脫的警告,將其更改爲

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

這是一個可惜:(看起來很糟糕......) – Lu4 2011-12-15 22:07:02

3

如果您引用的組件部署正確,他們應該「只加載」如果你調用它的類型之一。 .NET框架應該爲你處理這個問題。

這裏有一個很好的文章,解釋的方式爲您引用的程序框架搜索:http://msdn.microsoft.com/en-us/library/yx7xezcf(v=vs.71).aspx

我很好奇,你在做什麼,你需要提前加載程序集是這樣?

回答你的直接問題的一個竅門是使用Assembly.Load(字符串位置) - 雖然我會勸阻,除非絕對必要。 http://msdn.microsoft.com/en-us/library/ky3942xh.aspx

1

因此,您可以將您的bin目錄中的所有程序集加載到應用程序域中。這應該可以解決你的問題。

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

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

這是我做的:

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

... 

typeof(SomeType).EnsureAssemblyLoads(); 
相關問題