Поиск домашнего каталога для расширения Visual Studio 2010 - PullRequest
4 голосов
/ 06 января 2012

Я делаю изменения в мастере Visual Studio, который создает проект из шаблона и должен добавить ссылку на сборку в проект, который также находится в каталоге расширений. Поэтому мне нужно установить <hintpath>.

Мне не удалось выяснить, как работающее расширение VS может обнаружить свой каталог расширений, который называется следующим образом:

% USERPROFILE% \ AppData \ Local \ Microsoft \ VisualStudio \ 10.0 \ Extensions \ моякомп \ myExtension

Использование System.Reflection.Assembly.GetExecutingAssembly().CodeBase выход:

"C: \ Windows \ Microsoft.Net \ сборка \ GAC_MSIL \ myCompany.myExtension \ v4.0_1.0.0.0__936015a19c3638eb \ myCompany.myExtension.dll"

К сожалению, не полезно. Использование GetCallingAssembly() не лучше - оно указывает на другой каталог в MSIL_GAC.

Есть ли интерфейс Visual Studio, который возвращает эту информацию? Я не смог его найти.

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

Ответы [ 2 ]

4 голосов
/ 12 февраля 2012

Может быть, посмотрите на IInstalledExtension.InstallPath. Вы можете получить IInstalledExtension через IVsExtensionManager.

К сожалению, сообщение в комментариях говорит о том, что это неправильный способ сделать что-то:

Хотя этот API поддерживает инфраструктуру Extension Manager, мы рекомендуем не использовать его, поскольку он может быть изменен.

РЕДАКТИРОВАТЬ: Вот код:

    static IVsExtensionManager GetExtensionManager()
    {
        return myPackage.GetService(System.typeof(IVsExtensionManager)) as IVsExtensionManager;
    }
    static IInstalledExtension GetExtension(string identifier)
    {
        return GetExtensionManager().GetInstalledExtension(identifier);
    }
    static string GetExtensionDirectory(string identifier)
    {
        return GetExtension(identifier).InstallPath;
    }

string identifier - это то, что вы вводите в поле "ID" файла source.extension.vsixmanifest вашего расширения. По умолчанию используется GUID пакета.

1 голос
/ 16 сентября 2014

Извините, что выкопал старый ответ на вопрос ...

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

https://stackoverflow.com/a/24294185

http://blog.ninlabs.com/2011/04/auto-update-visual-studio-extensions/

Однако я решил изучить, как CodeGenerator в Asp.Net.Scaffolding обращался к файлам шаблонов. Оказывается, очень легко ...

var path = Path.Combine(Path.GetDirectoryName(GetType().Assembly.Location), "MyPath");

Simples

...