Разбор сборки квалифицированное имя? - PullRequest
27 голосов
/ 11 сентября 2009

Я хотел бы проанализировать квалифицированное имя сборки в .NET 3.5. В частности, сама сборка недоступна , это просто название. Я могу придумать много способов сделать это вручную , но я полагаю, что мне не хватает какой-либо функции для этого в системных библиотеках. Любое предложение?

Ответы [ 6 ]

18 голосов
/ 11 сентября 2009

Класс AssemblyName может проанализировать имя сборки за вас, просто передайте строку в ее конструктор. Если у вас есть имя типа, уточненное в сборке, я думаю, что сначала вам придется удалить часть типа строки (т. Е. Все до первой запятой).

6 голосов
/ 11 января 2011

В грамматике Mono и BNF для MSDN

имеется реализация синтаксического анализатора.
5 голосов
/ 09 июля 2014

Начиная с .Net 4 и далее у вас есть новое переопределение для Type.GetType:

public static Type GetType(
    string typeName,
    Func<AssemblyName, Assembly> assemblyResolver,
    Func<Assembly, string, bool, Type> typeResolver,
    bool throwOnError,
    bool ignoreCase
)

См. http://msdn.microsoft.com/en-us/library/ee332784%28v=vs.100%29.aspx

Что вам нужно сделать, это в примере выше документации:

Type t2 = Type.GetType(test,
            (aName) => aName.Name == "MyAssembly" ? 
                Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") : 
                Assembly.Load(aName),
            (assem, name, ignore) => assem == null ? 
                Type.GetType(name, false, ignore) : 
                assem.GetType(name, false, ignore), true
);

Вы можете заменить вышеуказанные лямбды более сложными функциями.

1 голос
/ 12 октября 2018

Существует класс TypeIdentifier в Alphaleonis.Reflection.Metadata (также доступный в NuGet), который может анализировать полное имя сборки (а также полное имя типа или имя простого типа), и Разобрать его и разрешить его модификацию.

0 голосов
/ 11 сентября 2009

Если сборка загружена, вы можете использовать что-то вроде этого:

    Assembly assembly = Assembly.GetExecutingAssembly();
    string assemblyName = assembly.GetName().Name;

В приведенном выше примере я использовал исполняющую сборку, но вы перебираете загруженную сборку.

Обновление: Вы всегда можете загрузить сборку в отдельный домен приложения, получить имя сборки и после того, как вы это сделаете, выгрузить ее. Дайте мне знать, если вам нужен образец.

0 голосов
/ 11 сентября 2009

Проверьте класс Path . Он имеет множество функций для анализа имен файлов. Или вы можете попробовать:

string qualType = @"System.String, mscorlib, Version=2.0.0.0, Culture=neutral, publicKeyToken=b77a5c561934e089";
Type t = Type.GetType(qualType, false); 
if (t == null) 
{
   Console.WriteLine("Invalid qualified type string.");
   return;
}
Console.WriteLine(t.FullName);

Так у вас есть что-то подобное?

Assembly assem = Assembly.LoadFile("PathToTheAssembly.dll");
Type t = assem.GetType("Namespace.And.Type.Name");
t.FullName

Если вы хотите проанализировать форму BNF , приведенный выше пример использования GetType должен работать для вас.

РЕДАКТИРОВАТЬ: Хорошо, это должно делать то, что вы хотите, если у вас есть имя:

Assembly assem = Assembly.GetAssembly(Type.GetType(assembly_qualified_name, false));
if(assem != null)
{
   byte[] pkt = assem.GetName().GetPublicKeyToken();
   Version ver = assem.GetName().Version;
   CultureInfo ci = assem.GetName().CultureInfo();
}
...