Как найти имя сборки по пространству имен

Is there a way of getting the assembly name from a namespace string? Eg, get «mscorlib» from «System».

The reason for my question is I’m creating Boo scripts method-by-method and am required to add namespaces programmatically. The resulting string in Boo would read:

import System from mscorlib

I could obviously pass in a collection of import strings, but if I can just pass a list of references, that would be far more scalable!

Many thanks

Marco van de Voort's user avatar

asked Feb 5, 2010 at 10:02

Robert Reid's user avatar

Assembly names and namespace names are totally orthogonal concepts. There are no real relations between them. Short of examining a set of known assemblies to see what namespaces they contain, there’s no real way to get assembly name from namespace name. For instance, what would you do if two assemblies (both mscorlib and System.Core) declared a type in the System namespace?

answered Feb 5, 2010 at 10:07

Mehrdad Afshari's user avatar

Mehrdad AfshariMehrdad Afshari

413k90 gold badges850 silver badges788 bronze badges

1

You can get it from a type:

Console.WriteLine(typeof(System.Object).Module.Name);

About the namespace, remember that more than one assembly could define the same namespace.

answered Feb 5, 2010 at 10:07

Paolo Tedesco's user avatar

Paolo TedescoPaolo Tedesco

54.7k33 gold badges143 silver badges192 bronze badges

1

Пространства имён и сборки

Пространства имён используют для логической группировки родственных типов, чтобы разработчику было проще найти нужный тип. Например в пространстве имён System.Text описаны типы для обработки строк, в System.IO типы для операций ввода и вывода.

Пространства имён можно объявлять как через директиву using:

using System.IO;
using System.Text

или писать полное имя с префиксом:

System.IO.FileStream fs = new System.IO.FileStream(...);

System.Text.StringBuilder sb = new System.Text.StringBuilder();

! CLR ничего не знает о пространстве имён. При обращении к какому-либо типу среде CLR нужно представить полное имя типа и сборку, содержащую описание типа, чтобы потом во время выполнения загрузить эту сборку и найти в ней нужны тип, чтобы далее им оперировать.

Связь между сборками и пространством имён

Пространство имен и сборка (файл, в котором реализован тип) не обязательно связаны друг с другом. В частности, различные типы, принадлежащие одному пространству имен, могут быть реализованы в разных сборках. Например, тип System.IO.FileStream реализован в сборке MSCorLib dll, а тип System. IO.FileSystemWatcher — в сборке System dll. На самом деле, сборка System IO dll в .NET Framework даже не поставляется. Одна сборка может содержать типы из разных пространств имен. Например, типы System.Int32 и System.Text.StringBuilder находятся в сборке MSCorLib dll.

Сборка
Цитата с MSDN (полный текст):

Сборки являются структурными элементами приложений .NET Framework; они
составляют основную единицу развертывания, управления версиями,
повторного использования, областей действия активации и разрешений
безопасности. Сборка представляет собой коллекцию типов и ресурсов,
собранных для совместной работы и образующих логическую функциональную
единицу. Сборка предоставляет общеязыковой исполняющей среде сведения,
необходимые для распознавания реализаций типов. Для среды выполнения
тип не существует вне контекста сборки.

Никакого упоминания пространств имен, только типы (классы, структуры и т.д.).

Пространство имен
Цитата с MSDN (полный текст):

В программировании на C# пространства имен используются с полной
нагрузкой по двум направлениям. Во-первых, платформа .NET Framework
использует пространства имен для организации множества классов.
Во-вторых, объявление собственного пространства имен поможет в
управлении областью действия имен классов и методов в крупных
программных проектах.

Опять же никакого упоминания сборок.

тогда я не знаю, такой вопрос в лабораторной

Скорее всего от вас хотят услышать, что перед использованием using SomeNameSpace;, вы должны указать в проекте ссылку на сборку, в которой объявлены типы данного пространства имен. Но это не ни как не влияет на то, что сборки и пространства имен не имеют жесткой связи на уровне языка и платформы. Пространства имен — всего лишь агрегатная приставка к имени типа для явного указания принадлежности типа к определенной группе логически связанных типов, не более того. А вот типы, в отличие от пространств имен, имеют жесткую связь со сборкой в которой находятся, об этом можно подробнее почитать в первой ссылке.

Как узнать полное имя моей сборки, например:

MyNamespace.MyAssembly, version=1.0.3300.0, 
Culture=neutral, PublicKeyToken=b77a5c561934e089

Мне удалось получить свой PublicKeyToken с помощью sn.exe в SDK, но я хотел бы легко получить полное квалифицированное имя.

10 ответов

Лучший ответ

Если вы можете загрузить сборку в приложение .NET, вы можете:

typeof(SomeTypeInTheAssembly).Assembly.FullName

Если вы не можете, вы можете использовать ildasm.exe, и он будет где-то там:

ildasm.exe MyAssembly.dll /text


35

Hallgrim
18 Мар 2009 в 17:56

Это бессовестная копия с сайта Я записываю это и это простой способ получить FQN для вывода проекта:

Open Visual Studio
Go to Tools –> External Tools –> Add
    Title: Get Qualified Assembly Name
    Command: Powershell.exe
    Arguments: -command "[System.Reflection.AssemblyName]::GetAssemblyName("$(TargetPath)").FullName"
    Check "Use Output Window".

Новый инструмент появится под Tools –> Get Qualified Assembly Name. Когда пункт меню выбран, имя сборки отображается в окне вывода.


151

David Clarke
5 Июл 2013 в 01:09

Поздно к вечеринке, но погуглил еще немного об этой проблеме и нашел эту страницу:

  • http://www.pvle.be/2010/04/getting-an-assemblys-strong-name-with-powershell/

Он описывает функцию PowerShell, которая может это сделать. Так. Я никогда раньше не использовал PowerShell, но решил попробовать:

C:> cd PATH_TO_ASSEMBLY   
C:PATH_TO_ASSEMBLY>powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:PATH_TO_ASSEMBLY> [System.Reflection.AssemblyName]::GetAssemblyName('System.Data.SQLite.dll').FullName
System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139
PS C:PATH_TO_ASSEMBLY>

Это выполняет трюк, упомянутый в других ответах, с помощью кода, за исключением того, что вам не нужно создавать для этого проект — просто введите в командной строке;)


25

Daren Thomas
7 Мар 2013 в 16:01

Кроме того, если вы ищете полное имя для сборки, уже находящейся в GAC, вы можете запустить командную строку Visual Studio (самый простой способ задать правильные пути) и использовать gacutil /l для вывода списка всех сборок с их соответствующими FQN. . Используйте gacutil /l <yourassemblyname>, чтобы отфильтровать список, чтобы упростить поиск того, что вы ищете.


6

Per Noalt
16 Авг 2011 в 20:20

Если вы загрузите сборку (DLL, EXE и т. Д.) В Reflector, он сообщит вы полное строгое имя внизу.


5

Richard Slater
18 Мар 2009 в 17:25

JetBrains dotPeek или Telerik JustDecompile неплохие. Просто откройте DLL, и вы сразу получите имя.


4

uli78
14 Мар 2013 в 19:27

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


6

csharpfolk
27 Авг 2012 в 13:52

Будучи олдскульным и любя cmd больше, чем powershell, я написал себе этот пакетный скрипт, чтобы сделать это:

@REM fqn.bat <dll_path>
powershell -command "([system.reflection.assembly]::loadfile('%~f1')).FullName"

%~f1 заменяет первый параметр на абсолютный путь, таким образом, выполняется:

fqn mydll.dll 

Напечатает желаемое полное имя.


1

Scott Stafford
24 Янв 2019 в 19:31

Используйте Assembly.GetTypes() — это даст вам коллекцию всех типов, а затем вы можете получить свойство Namespace для каждого из них.

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

sharptooth
17 март 2009, в 06:32

Поделиться

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

Я не знаю, есть ли лучший способ, но вы можете попробовать искать определенный тип, подобный этому (add-using linq;):

myassembly.GetTypes().SingleOrDefault(t => t.Name == "ClassName")

Это эффективно срабатывает, если в разных пространствах имен существует более одного класса с этим именем (поскольку метод Single гарантирует, что существует только 1).

Для списка пространств имен для этого класса вы можете:

Assembly.Load("ClassName").GetTypes().Select(t => t.Namespace).Distinct();

eglasius
17 март 2009, в 07:09

Поделиться

Обновлено:

IF assembly name и assembly namespace одинаковые в вашем проекте, и вы обязательно держите тему те же И, вы хотите получить пространство имен текущей выполненной сборки , затем, вы можете использовать это:

var namespace = Assembly.GetExecutingAssembly().GetName().Name;

И для вашей загруженной сборки:

var namespace = myAssembly.GetName().Name;

Но IF assembly name и assembly namespace не являются одинаковыми в вашем проекте, тогда вы можете использовать этот способ:

// Like @eglasius answer >>
// Find all namespaces in the target assembly where a class with the following name is exists:
var namespaceList=Assembly.Load("MyClassName").GetTypes().Select(t => t.Namespace).Distinct();

RAM
06 май 2015, в 14:18

Поделиться

Assembly.GetName().Name предоставит вам пространство имен по умолчанию

Lance H
29 окт. 2014, в 17:30

Поделиться

Используя Mono/Xamarin, у вас нет доступа к свойству «NameSpace». Вместо этого вы можете использовать следующее:

var str = typeof(ATypeInTheAssembly).AssemblyQualifiedName;
return str.Split(',')[1].Trim();

Jean
11 дек. 2016, в 10:50

Поделиться

Получение сборки должно содержать почти класс (или любой другой тип, такой как интерфейс), и они должны содержаться в пространстве имен, которое должно начинаться в пространстве имен сборки, причем самый короткий из них будет последним.

Итак, вот решение, которое я нашел:

public string GetAssemblyNamespace(Assembly asm)
{
    string ns = @"";
    foreach (Type tp in asm.Modules.First().GetTypes()) //Iterate all types within the specified assembly.
        if (ns.Length == 0 ? true : tp.Namespace.Length < ns.Length) //Check whether that the shortest so far.
            ns = tp.Namespace; //If it's, set it to the variable.
    return ns; //Now it is the namespace of the assembly.
}

Я просто нахожу все типы внутри необходимой сборки, и я ищу, что содержится в пространстве имен, имеющем кратчайшее имя.

Davide Cannizzo
18 июль 2017, в 23:50

Поделиться

Чтобы принять только пространство имен, следуйте приведенному ниже коду:

  var assembly = System.Reflection.Assembly.GetAssembly(this.GetType());//Get the assembly object
  var nameSpace = assembly.GetType().Namespace;//Get the namespace

ИЛИ

public string GetNamespace(object obj)
{
    var nameSpace = obj.GetType().Namespace;//Get the namespace

    return nameSpace;
}

Tiago S
13 апр. 2016, в 14:05

Поделиться

Ещё вопросы

  • 0javascript / jquery получить значение переменной [дубликата]
  • 0не удается установить Dlib на Windows 10
  • 0Как разрешить дублирование идентификатора строки mysql в массиве?
  • 1Tkinter: список флажков не отвечает
  • 0Requirejs — Динамическое внедрение зависимостей модуля с переменными
  • 1Предложения по оптимизации этого Java-кода с помощью математических функций
  • 1как вызвать функцию js из c # wpf
  • 1Javascript document.cookie = «ключ = значение» добавляется вместо замены
  • 0Angular Grid (ag-grid) показать / скрыть не работает
  • 1Angular 2 Host Listener Change div heigtht
  • 1Получение файлов из программных файлов
  • 1A * с осознанием врага
  • 0проблема asp.net с datasrc и datafld для получения информации XML
  • 0Потерянный в pointerworld, запись в переменную через массив
  • 0Получить сумму всех строк в каждой записи
  • 1Исключение, которое выдается, когда переменные экземпляра равны нулю
  • 0Как обнаружить, что директива B находится внутри директивы A
  • 0Laravel Eloquent запрос сборки выберите минимальное значение
  • 0Не удается обновить поле даты и времени MS SQL с помощью PHP
  • 0Выполните поиск, используя фильтр, но игнорируя знаки препинания
  • 0Safari 100% DIV оставляет место на правой стороне
  • 1Как убрать черную полосу, появляющуюся внизу?
  • 0Попытка создать функцию, где я могу искать в моей базе данных и получать результаты поиска. ошибки
  • 0JQuery строка для номера обратно в строку
  • 1Ошибка времени выполнения NullPointerException
  • 0Сделайте фон поля поиска кликабельным
  • 0TBB Linker error Как узнать, что я пропустил включение или код устарел?
  • 0Оконная директива AngluarJS, показывающая вид?
  • 1преобразование строки в int в сокете клиентского сервера в Java
  • 0REST API не поддерживает группировку SQL. Есть ли способ преодолеть это?
  • 1Изменение локали во время выполнения, не затрагивающее фрагменты
  • 0как отобразить данные в столбце с sql и php
  • 0Система маршрутизации для Custom Framework с компонентами Symfony
  • 0Обновите родительскую область из директивы Child
  • 0Стрлен переменной GET
  • 0Анимация при наведении курсора с несколькими файлами изображений
  • 0Почему я не могу найти совпадений с knnMatch, используя OpenCV с C ++?
  • 1Как изменить цвет легенды в чартах и добавить еще одну легенду?
  • 0Выберите, где значение может быть нулевым или нет
  • 0СБОЙ: ParseException строка 1:94 не соответствует вводу ‘hdfs’, ожидая StringLiteral рядом с ‘location’ в расположении раздела
  • 1Как удалить элементы из отфильтрованных данных — Vue.js 2.x
  • 0Изменить цвет фона из ввода
  • 1Внедрение зависимостей источника данных и jdbctemplate?
  • 1Как установить TCP-соединение и отправить данные в Android Virtual Device App
  • 1Где поместить папку META-INF для приложения JPA
  • 1Преобразование даты в Java-приложении
  • 1Программа всегда входит в систему, даже если имя пользователя неверно
  • 0.addClass — Как вызвать CSS из связанных CSS?
  • 1Пропуск рабочего до готового?
  • 0Как использовать VBA для изменения «проверенного» свойства переключателей на веб-странице

Понравилась статья? Поделить с друзьями:
  • Excel как найти недопустимую ссылку
  • Потерял телефон как найти по емейл
  • Как правильно пишется найди здесь ошибку
  • Как найти сульфат калия формула
  • Как найти работу ролик