Как получить пространство имен по умолчанию для проекта csproj (VS 2008) - PullRequest
8 голосов
/ 03 февраля 2011

У меня есть VS 2008 и проект csproj (библиотека C #).

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

Возможно ли во время выполнения получить значение пространства имен по умолчанию ??

Моя цель - использовать ресурсы, и мне нужно значение пространства имен по умолчанию:

 Assembly assembly = Assembly.GetExecutingAssembly();

 //foreach (string resourceName in assembly.GetManifestResourceNames()){}

 Stream syntaxModeStream = assembly.GetManifestResourceStream(pathToResources
+ ".SyntaxModes.xml");

Обновление:

Питер сказал, что не могу. Пространство имен по умолчанию не сохраняется в сборке

var resource = assembly.GetManifestResourceNames().Single(p => p.EndsWith(".SyntaxModes.Xml"))

где хранится пространство имен по умолчанию ??

Только я могу читать, используя Addins Visual Studio (объект DTE) ??

Ответы [ 4 ]

14 голосов
/ 03 февраля 2011

Вы не можете.

Пространство имен по умолчанию не сохраняется нигде в сборке.Это просто настройка проекта Visual Studio.

Я обычно использую имя сборки: Assembly.GetName().Name.Проблема заключается в том, что он работает только в том случае, если имя сборки не было изменено.

Для вашей конкретной проблемы вы можете использовать assembly.GetManifestResourceNames() и выполнить некоторые тесты над этими именами, например:

string name = assembly.GetManifestResourceNames().Single(p => p.EndsWith(".SyntaxModes.Xml"))
5 голосов
/ 03 февраля 2011

Не уверен на 100%, что это то, что вы ищете, но вы можете получить пространство имен, используя:

this.GetType().Namespace
1 голос
/ 25 февраля 2016

Я написал метод расширения для Assembly, который просто находит ресурс по его имени в пределах включенных ресурсов:

public static Stream GetManifestResourceStreamByFileName(this Assembly assembly, string fileName)
{
    var targetName = assembly.GetManifestResourceNames()
        .FirstOrDefault(x => x.EndsWith("." + fileName));

    return targetName == null ? null : assembly.GetManifestResourceStream(targetName);

}

, тогда вы просто вызываете так:

    var assembly = Assembly.GetExecutingAssembly(); // or Assembly.GetAssembly(this.GetType()) or whatever

    var myResource = assembly.GetManifestResourceStreamByFileName("myResource.jpg");
0 голосов
/ 23 августа 2018

Я зашел на эту страницу в поисках подтверждения, что я ничего не пропустил при поиске свойства сборки, соответствующего корневому пространству имен, введенному на главной странице свойств проекта Visual Studio приложения Windows.

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

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

System.Reflection.Assembly.GetEntryAssembly ( ).EntryPoint.DeclaringType.Namespace )

Следующий оператор C #,выполняется из любого места в домене приложения, даже через вызов метода, который достигает DLL, сообщает имя подпрограммы точки входа и ее пространство имен.

Console.WriteLine (
    "Namespace of Entry Point Routine {0} = {1} " ,
    System.Reflection.MethodBase.GetCurrentMethod ( ).Name ,
    System.Reflection.Assembly.GetEntryAssembly ( ).EntryPoint.DeclaringType.Namespace );

Для программы в режиме консоли с именем OperatingParameters_Demo.exe,корневое пространство имен которого OperatingParameters_Demo , приведенное выше выражение дает следующий вывод:

Namespace of Entry Point Routine Main = OperatingParameters_Demo

Практическое использование этого выражения заключается в том, что вы можете использовать его для создания абсолютного (полностью определенного) именииз Properties.Settings и Properties.Resources пространств имен записи сборки.

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

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

Этот демонстрационный проект начался, когда я начал работать над инструментом программиста для импорта заголовочных файлов C / C ++ в каталог проекта, чтобы я мог развернуть автономный проект в GitHub, даже если главные копииЗаголовки хранятся в другом месте, потому что они совместно используются десятками проектов.Когда его механизм разбора параметров приблизился к завершению, я понял, что невероятно близок к тому, чтобы иметь общий анализатор рабочих параметров и хранилище резервных копий, которые я хотел получить в течение многих лет.Импортер заголовков C / C ++ будет в конечном итоге опубликован.Однако на данный момент только его двигатель разбора завершен.Поскольку он полезен сам по себе, я намерен сначала опубликовать его.Оставайтесь с нами на The Code Project и GitHub .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...