4

我正在对从模板创建项目的 Visual Studio 向导进行更改,并且需要将对程序集的引用添加到也位于扩展目录中的项目中。所以我需要设置<hintpath>.

我一直无法弄清楚一个正在运行的 VS 扩展如何发现它的扩展目录,这是一个像这样的目录名称:

%USERPROFILE%\AppData\Local\Microsoft\VisualStudio\10.0\Extensions\myCompany\myExtension

使用System.Reflection.Assembly.GetExecutingAssembly().CodeBase产量:

"C:\Windows\Microsoft.Net\assembly\GAC_MSIL\myCompany.myExtension\v4.0_1.0.0.0__936015a19c3638eb\myCompany.myExtension.dll"

不幸的是,没有帮助。使用GetCallingAssembly()也好不到哪里去——它指向 MSIL_GAC 中的另一个目录。

是否有返回此信息的 Visual Studio 界面?我一直没能找到它。

如果那不可能,是否至少可以确定扩展是在实验实例中运行还是在非实验实例中运行?我可以使用该信息来定位扩展目录。

4

2 回答 2

4

也许看看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是您在扩展source.extension.vsixmanifest文件的“ID”字段中输入的任何内容。它默认为包 GUID。

于 2012-02-12T09:35:11.367 回答
1

抱歉挖掘了一个旧的已回答问题...

我正在研究一个类似的问题,并实现了扩展管理器,但认为这非常糟糕,但如果你确实想使用它,这些链接也会有所帮助:

https://stackoverflow.com/a/24294185

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

但是,我决定研究 Asp.Net.Scaffolding 中的 CodeGenerator 如何访问模板文件。结果,很容易...

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

简单的

于 2014-09-16T09:31:06.657 回答