如何从MSBuild <usingtask>标记

时间:2017-06-12 23:18:30

标签: msbuild visual-studio-extensions

我正在开发Visual Studio扩展。扩展程序的相关VS项目模板包括对扩展程序DLL中的自定义任务的调用:

&lt; UsingTask TaskName =&#34; MyTask&#34; AssemblyFile =&#34; MyDLL.dll的路径&#34; /&GT;

通过使用VSIX安装程序,扩展程序将安装在通常的位置。

我的问题是:是否有一个好的MSBuild属性或宏可用于构建扩展程序的DLL(即MyDLL.dll)的路径?我知道$(DevEnvDir)并且在Visual Studio 2015中使用项目和扩展时可以扩展该路径(附加\ VendorName \ ProductName \ Version),但这似乎不适用于VS 2017,附加路径使用的是一个不能提前预测的错位名称(或者可以吗?)。还有一个问题是项目/扩展应该在VS实验实例中工作,它似乎不反映$(DevEnvDir)。

使用MSBuild属性有没有好的方法,或者我需要查看环境变量或注册表等替代方案?

2 个答案:

答案 0 :(得分:1)

  

使用MSBuild属性有没有好的方法,或者我需要查看环境变量或注册表等替代方案?

您可以使用环境变量或注册表来实现它。

  1. 环境变量
  2. 你可以使用这样的环境变量:

    <UsingTask TaskName="MyTask" AssemblyFile="$(yourenvironmentvariablesname)MyDLL.dll" />
    

    有关详细信息,请参阅:

    https://docs.microsoft.com/en-us/visualstudio/msbuild/how-to-use-environment-variables-in-a-build

    1. 注册表
    2. 你可以使用这样的注册表:

      <UsingTask TaskName="MyTask" AssemblyFile="$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework@DbgManagedDebugger)MyDLL.dll" />
      

      注意:请根据需要更改相关的注册表路径。

      https://blogs.msdn.microsoft.com/msbuild/2007/05/04/new-registry-syntax-in-msbuild-v3-5/

答案 1 :(得分:0)

对我来说有意义的解决方案是创建一个向导,并在替换字典中设置扩展安装位置的路径,然后将模板中的替换项与UsingTask一起使用。

public class ProjectLocationWizard : IWizard
{
    public void BeforeOpeningFile(ProjectItem projectItem)
    {
    }

    public void ProjectFinishedGenerating(Project project)
    {
    }

    public void ProjectItemFinishedGenerating(ProjectItem projectItem)
    {
    }

    public void RunFinished()
    {
    }

    public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
    {
        var wizardDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
        replacementsDictionary.Add("$installlocation$", wizardDirectory);
    }

    public bool ShouldAddProjectItem(string filePath)
    {
        return true;
    }
}

<UsingTask AssemblyFile="$installlocation$\MyTask.dll" TaskName="MyTask" />

尽管向导文档说要签署向导程序集,但我没有签署,并且如果没有,它也可以正常工作。