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

Можно ли использовать Type.GetType с динамически загруженной сборкой?

Скажем, у меня есть немного кода:

public static void LoadSomething(Type t)
{            
    var t1 = Type.GetType(t.AssemblyQualifiedName);

    var t2 = t
        .Assembly
        .GetTypes()
        .First(ta => ta.AssemblyQualifiedName == t.AssemblyQualifiedName);
}

Что происходит, так это то, что t1 null, а t2 не null. Я был смущен, потому что, если я так называю это...

LoadSomething(typeof(SomeObject));

а затем ни не являются нулевыми, но то, что я на самом деле делаю, больше похоже на это (на самом деле это не упрощено, а иллюстрирует мою точку зрения):

LoadSomething(Assembly.LoadFile(@"C:\....dll").GetTypes().First());

Итак, первая часть моего вопроса (для моей информации)...

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

И во-вторых (чтобы решить мою проблему)...

Есть ли другой способ загрузки типа, когда у меня есть только квалифицированное имя сборки как строка (которая, как я знаю, была ранее загружена с использованием методов Assembly.Load)?

4b9b3361

Ответ 1

  Есть ли какой-то другой способ, которым я мог бы загрузить тип, когда у меня есть только сборка квалифицированное имя в виде строки (что я знаю, был ранее загружается с использованием методов Assembly.Load)?

Да. Существует перегрузка GetType, которая позволяет это. В качестве параметра он принимает функцию "распознавателя сборки":

public static Type LoadSomething(string assemblyQualifiedName)
{
    // This will return null
    // Just here to test that the simple GetType overload can't return the actual type
    var t0 = Type.GetType(assemblyQualifiedName);

    // Throws exception is type was not found
    return Type.GetType(
        assemblyQualifiedName,
        (name) =>
        {
            // Returns the assembly of the type by enumerating loaded assemblies
            // in the app domain            
            return AppDomain.CurrentDomain.GetAssemblies().Where(z => z.FullName == name.FullName).FirstOrDefault();
        },
        null,
        true);
}

private static void Main(string[] args)
{
    // Dynamically loads an assembly
    var assembly = Assembly.LoadFrom(@"C:\...\ClassLibrary1.dll");

    // Load the types using its assembly qualified name
    var loadedType = LoadSomething("ClassLibrary1.Class1, ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");

    Console.ReadKey();
}

Ответ 2

из http://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname.aspx

Свойство Type.AssemblyQualifiedName

Тип: System.String Имя, присвоенное сборке типа, которое включает имя сборки, из которой был загружен Тип, или null, если текущий экземпляр представляет параметр общего типа.

Я думаю, потому что подпись метода имеет t как тип.