Подтвердить что ты не робот

Удостоверяющее имя сборки?

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

4b9b3361

Ответ 1

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

Ответ 2

От .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
);

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

Ответ 4

Ознакомьтесь с классом 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 должен работать на вас.

EDIT: Хорошо, это должно делать то, что вы хотите, если у вас есть имя:

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();
}

Ответ 5

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

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

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

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