Я хотел бы проанализировать имя сборки в .NET 3.5. В частности, сама сборка недоступна, это просто имя. Я могу придумать много способов сделать это вручную, но, я думаю, у меня может быть какая-то особенность, которая может быть выполнена в системных библиотеках. Любое предложение?
Удостоверяющее имя сборки?
Ответ 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
);
Вы можете заменить вышеперечисленные лямбды более сложными функциями.
Ответ 3
Существует реализация парсера в Mono и BNF-грамматика на MSDN
Ответ 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, чтобы получить имя сборки, и после того, как вы закончите, выгрузите его. Дайте мне знать, если вам нужен образец.