2011-12-09 25 views
0

這裏是情況: 我有兩個項目。 ConsoleApp和類庫。控制檯應用程序引用類庫。 Class庫中有Person類。.Net大會裝載問題,如果沒有直接引用程序集成員

下面的代碼返回在類型變量空:

static void Main(string[] args) 
{ 
    Type type = AppDomain.CurrentDomain.GetAssemblies() 
.Select(a => a.GetType("LoadTest.Person", false)).Where(t => t != null).FirstOrDefault(); 
} 

但是如果我直接添加聲明,代碼工作良好。

static void Main(string[] args) 
{ 
    Person p = null; 
    Type type = AppDomain.CurrentDomain.GetAssemblies() 
.Select(a => a.GetType("LoadTest.Person", false)).Where(t => t != null).FirstOrDefault(); 
} 

這是已知的問題。但是,沒有聲明任何彙編成員的解決方案?

在此先感謝。

+4

加載的程序集的心不是在運行時獲得組件列表。你必須先加載它。 – vcsjones

+0

這是否意味着唯一的解決方案是直接使用CurrentDomain.Load加載它? – Danil

+0

這將是一個方法來做到這一點。 – vcsjones

回答

1

你可以簡單:

var personType = typeof(Person) 

將加載組件,給你你想要的類型,但如果你想使用Assembly類由於某種原因,這樣做:

var type = Assembly.GetAssembly(typeof(Person)).GetType("LoadTest.Person"); 

或者如果你不知道運行時類型和dll文件名,但你可以確定dll在工作目錄中,你可以這樣做:

var type = new DirectoryInfo(Environment.CurrentDirectory).GetFiles("*.dll").Select(f => Assembly.LoadFile(f.FullName)).Select(assembly => assembly.GetType("LoadTest.Person")).FirstOrDefault(); 
+0

我不能這樣做,因爲我不知道在運行時輸入類型。 – Danil

+0

你在運行時有什麼,一個完全限定類型名稱(LoadTest.Person)的字符串? –

+0

是的,只是完全合格的名稱 – Danil

1

使用Assembly.Load方法加載程序集,然後從中創建類型。

1

嘗試指定像集的名稱:

GetType("LoadTest.Person, nameoftheassemblycontainingperson"); 

讓我們說,如果你的類人被包含在LoadTest.dll,你可以這樣寫:

GetType("LoadTest.Person, LoadTest"); 

不要忘記部署它是手動的,因爲如果您要移除引用,包含人員的程序集將不會自動複製到工作應用程序的位置。

2

它返回空類型變量的原因是 AppDomain.CurrentDomain.GetAssemblies不包含您在項目中添加的引用程序集。這是應用程序執行的獨立環境。

您需要將類庫加載到您的程序集的AppDomain上下文中。 此基礎上你的榜樣,將這個

AppDomain.CurrentDomain.Load("LoadTest"); 

,你可以使用

Assembly[] assems = AppDomain.CurrentDomain.GetAssemblies(); 
相關問題