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

Как получить сборку (System.Reflection.Assembly) для заданного типа в .Net?

В .Net, учитывая имя типа, существует метод, который сообщает мне, в какой сборке (экземпляр System.Reflection.Assembly) этот тип определен?

Я предполагаю, что в моем проекте уже есть ссылка на эту сборку, просто нужно знать, какой из них есть.

4b9b3361

Ответ 1

Assembly.GetAssembly предполагает, что у вас есть экземпляр типа, а Type.GetType предполагает, что у вас есть полное имя типа, которое включает имя сборки.

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

public static String GetAssemblyNameContainingType(String typeName) 
{
    foreach (Assembly currentassembly in AppDomain.CurrentDomain.GetAssemblies()) 
    {
        Type t = currentassembly.GetType(typeName, false, true);
        if (t != null) {return currentassembly.FullName;}
    }

    return "not found";
}

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

Ответ 2

Assembly.GetAssembly(typeof(System.Int32))

Замените System.Int32 тем типом, который вам понадобится. Поскольку он принимает параметр Type, вы можете сделать что угодно, например:

string GetAssemblyLocationOfObject(object o) {
    return Assembly.GetAssembly(o.GetType()).Location;
}

Ответ 3

Я адаптировал принятый ответ для своих целей (вернув объект сборки вместо имени сборки) и реорганизовал код для VB.NET и LINQ:

Public Function GetAssemblyForType(typeName As String) As Assembly
    Return AppDomain.CurrentDomain.GetAssemblies.FirstOrDefault(Function(a) a.GetType(typeName, False, True) IsNot Nothing)
End Function

Я просто делюсь с ним здесь, если кто-то еще захочет принять решение LINQy на принятый ответ.

Ответ 4

Type.GetType(typeNameString).Assembly

Ответ 5

Если вы можете использовать его, этот синтаксис является самым коротким/самым чистым:

typeof(int).Assembly