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

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

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

Ответы [ 5 ]

37 голосов
/ 17 июля 2009

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";
}

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

31 голосов
/ 17 июля 2009
Assembly.GetAssembly(typeof(System.Int32))

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

string GetAssemblyLocationOfObject(object o) {
    return Assembly.GetAssembly(o.GetType()).Location;
}
2 голосов
/ 05 сентября 2013

Я адаптировал принятый ответ для своих собственных целей (возвращая объект сборки вместо имени сборки) и переработал код для 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 для принятого ответа.

2 голосов
/ 17 июля 2009
Type.GetType(typeNameString).Assembly
0 голосов
/ 17 июля 2009

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

typeof(int).Assembly
...