我想从引用(它是一个项目引用)程序集访问类型信息。困难的方法是使用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