我想從引用(它是一個項目引用)程序集訪問類型信息。困難的方法是使用VS解決方案來解析程序集的文件路徑,並從文件中加載程序集,但是我相信由於引用的程序集已經在執行程序集中解析/加載,所以必須有一種更簡單的方法,但這種方式真的逃脫了我。我怎樣才能做到這一點?如何從引用程序集中獲取類型?
例如,在我的MainAssembly
中,我參考LibAssembly
。現在,在MainAssembly
的代碼中,我需要迭代LibAssembly
中定義的類型的成員。
我想從引用(它是一個項目引用)程序集訪問類型信息。困難的方法是使用VS解決方案來解析程序集的文件路徑,並從文件中加載程序集,但是我相信由於引用的程序集已經在執行程序集中解析/加載,所以必須有一種更簡單的方法,但這種方式真的逃脫了我。我怎樣才能做到這一點?如何從引用程序集中獲取類型?
例如,在我的MainAssembly
中,我參考LibAssembly
。現在,在MainAssembly
的代碼中,我需要迭代LibAssembly
中定義的類型的成員。
我知道的最簡單的方法是使用反射。如果你有一個叫做類MyClass
內LibAssembly定義,從你的主要部件,你可以調用如下代碼:
Type[] types = Assembly.GetAssembly(typeof(MyClass)).GetTypes();
這將讓你的所有類型的內LibAssembly。
編輯:
如果你不知道任何類型的事先並可以假設該庫將在相同的物理位置的可執行文件,可能沿以下路線的東西會工作:
using System;
using System.IO;
using System.Reflection;
string libraryFileName = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "myLib.dll");
Assembly assembly = Assembly.LoadFrom(libraryFileName);
Type[] myTypes = assembly.GetTypes();
要獲得所有加載的程序集的列表,你可以嘗試問的應用程序域:
AppDomain MyDomain = AppDomain.CurrentDomain;
Assembly[] AssembliesLoaded = MyDomain.GetAssemblies();
foreach (Assembly MyAssembly in AssembliesLoaded)
{
//
}
然後你可以通過所有加載的程序集並通過反射來獲取它們的類型。
這種方法有效,但有一個問題:我需要獲取類型的程序集直到我從該程序集實例化類型時才加載。這是一種Catch-22,因爲我試圖找出該組件中的類型。 – ProfK 2010-08-08 12:08:07
'Type [] types = typeof(MyClass).Assembly.GetTypes();' – 2010-08-08 10:56:37
我的問題是我不一定知道LibAssembly中的任何一種類型。 – ProfK 2010-08-08 11:59:22
好吧,我看到了,我用一個可能的解決方案更新了我的答案。 – nukefusion 2010-08-09 07:18:12