Как получить сборку (System.Reflection.Assembly) для данного типа в .Net?
-
16-09-2019 - |
Вопрос
Существует ли в .Net, учитывая имя типа, метод, который сообщает мне, в какой сборке (экземпляр System.Reflection.Assembly) определен этот тип?
Я предполагаю, что в моем проекте уже есть ссылка на эту сборку, просто нужно знать, какая именно.
Решение
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";
}
Это также предполагает, что ваш тип объявлен в корне.Вам нужно будет указать пространство имен или включающие типы в имени или выполнить итерацию таким же образом.
Другие советы
Assembly.GetAssembly(typeof(System.Int32))
Заменять System.Int32
с любым типом, который вам нужен.Потому что он принимает Type
параметр, вы можете сделать что угодно таким образом, например:
string GetAssemblyLocationOfObject(object o) {
return Assembly.GetAssembly(o.GetType()).Location;
}
Я адаптировал принятый ответ для своих целей (вернув объект сборки вместо имени сборки) и провел рефакторинг кода для 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 для принятого ответа.
Type.GetType(typeNameString).Assembly
Если вы можете его использовать, этот синтаксис будет самым коротким/чистым:
typeof(int).Assembly