我尝试了Assembly.ReflectionOnlyLoadFrom(@"path\System.Core.dll")
和ReflectionOnlyLoad,但我遇到了异常和错误。如何正确获取程序集中的所有名称空间/类?
例如我得到了这个例外。
Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
答案 0 :(得分:3)
加载程序集,然后获取所有类型的列表:
Assembly assembly = Assembly.ReflectionOnlyLoadFrom("System.Core.dll");
Type[] types = assembly.GetTypes();
不幸的是,如果无法加载任何暴露类型,这将引发异常,有时无法避免此加载失败。在这种情况下,抛出的异常包含已成功加载的所有类型的列表,因此我们可以这样做:
Assembly assembly = Assembly.ReflectionOnlyLoadFrom("System.Core.dll");
Type[] types;
try
{
types = assembly.GetTypes();
}
catch (ReflectionTypeLoadException ex)
{
types = ex.Types;
}
这将为您提供所有类型的列表,包括接口,结构,枚举等...(如果您只想要类,那么您可以过滤该列表。)
答案 1 :(得分:2)
如果您可以参考System.Core,那么
List<string> namespaces = new List<string>();
var refs = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
foreach (var rf in refs) {
if (rf.Name == "System.Core")
{
var ass = Assembly.Load(rf);
foreach (var tp in ass.GetTypes())
{
if (!namespaces.Contains(tp.Namespace))
{
namespaces.Add(tp.Namespace);
Console.WriteLine(tp.Namespace);
}
}
}
}
如果不能,则需要附加到CurrentDomain的AssemblyResolve事件并加载System.Core.dll在加载dll时使用的所有类型的程序集。
答案 2 :(得分:1)
以下是您提问的answer。 我不需要复制&amp;将它粘贴到此处,可能更绿色以节省空间,而不是从其他线程复制代码。 : - )