查找Visual Studio 2010扩展的主目录

4
我正在修改一个用于从模板创建项目的Visual Studio向导,并需要将与扩展目录中的项相对应的引用添加到项目中。因此,我需要设置。
我无法弄清楚运行中的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界面?我找不到它。
如果不可能,那么至少能否确定扩展是否在实验实例中运行而不是非实验实例?我可以使用该信息来找到扩展目录。
2个回答

4
也许可以查看 IInstalledExtension.InstallPath。您可以通过 IVsExtensionManager 获取一个IInstalledExtension
不幸的是,备注中的信息表明这不是正确的做法:

尽管此 API 支持扩展管理器基础结构,但我们建议您不要使用它,因为它可能会发生更改。

编辑: 这里是代码:
    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。


谢谢!我会尝试一下并进行一些合理性检查。如果不行,我仍然可以退回到我现在使用的临时解决方案。 - UweBaemayr
也许有用的返回值:return Package.GetGlobalService(typeof(IVsExtensionManager)) as IVsExtensionManager; - Kiquenet

1
抱歉挖掘一个旧的已经回答的问题...
我在研究类似的问题,并实现了扩展管理器,但是我认为这种方法非常糟糕,如果你确实想使用它,以下链接也会有所帮助:

https://dev59.com/6oDba4cB1Zd3GeqPIcOU#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");

简单。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接