【问题标题】:Finding the home directory for a Visual Studio 2010 extension查找 Visual Studio 2010 扩展的主目录
【发布时间】:2012-02-04 10:22:04
【问题描述】:

我正在对从模板创建项目的 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 界面?我没找到。

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

【问题讨论】:

    标签: visual-studio visual-studio-2010 visual-studio-extensions


    【解决方案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");
    

    简单

    【讨论】:

      【解决方案2】:

      也许看看IInstalledExtension.InstallPath。您可以通过IVsExtensionManager 获得IInstalledExtension

      不幸的是,评论中的信息表明这不是正确的做事方式:

      虽然此 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。

      【讨论】:

      • 谢谢!我会通过一些健全性检查来尝试一下。我总是可以让它回到我现在正在使用的kludge。
      • 也许有用 return Package.GetGlobalService(typeof(IVsExtensionManager)) as IVsExtensionManager;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      相关资源
      最近更新 更多