Я пробовал Assembly.ReflectionOnlyLoadFrom(@"path\System.Core.dll")
и ReflectionOnlyLoad, но у меня есть исключения и ошибки. Как правильно получить все пространства имен/классы в сборке?
Например, я получил это исключение.
Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
Если вы можете ссылаться на 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);
}
}
}
}
Если вы не можете, вам нужно будет прикрепить к событию AssemblyResolve CurrentDomain и загрузить все сборки типов, которые использует System.Core.dll при загрузке dll.
Чтобы загрузить сборку, а затем получить список всех типов:
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;
}
Это даст вам список всех типов, включая интерфейсы, структуры, перечисления и т.д. (если вам нужны только классы, вы можете отфильтровать этот список).
Вот ваш ответ на ваш вопрос. Мне не нужно копировать и вставлять его здесь для вас, это может быть greener, чтобы сэкономить место, а не копировать код из другого потока.: -)