Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2010 如何使用MEF部署MSBuild自定义任务?_Visual Studio 2010_Msbuild_Mef_Vsix - Fatal编程技术网

Visual studio 2010 如何使用MEF部署MSBuild自定义任务?

Visual studio 2010 如何使用MEF部署MSBuild自定义任务?,visual-studio-2010,msbuild,mef,vsix,Visual Studio 2010,Msbuild,Mef,Vsix,我有许多用于VisualStudio2010的自定义项和项目模板。 我已经构建了一个VSIX包,可以用来将这些扩展部署到多个开发人员的机器上 我现在正在创建新项模板所需的自定义MSBuild任务 在我的本地项目中,我可以通过在项目文件中输入硬编码路径来实现这一点: 但是,当VSIX包部署到“dev”Visual Studio实例时,这不起作用。 Visual Studio只是报告找不到CustomBuildTask.dll VSIX在哪里部署DLL? 是否有MSBuild%(path)变量可用

我有许多用于VisualStudio2010的自定义项和项目模板。 我已经构建了一个VSIX包,可以用来将这些扩展部署到多个开发人员的机器上

我现在正在创建新项模板所需的自定义MSBuild任务

在我的本地项目中,我可以通过在项目文件中输入硬编码路径来实现这一点:

但是,当VSIX包部署到“dev”Visual Studio实例时,这不起作用。 Visual Studio只是报告找不到CustomBuildTask.dll

VSIX在哪里部署DLL? 是否有MSBuild%(path)变量可用于在其他计算机上查找DLL, 或者每个用户都必须手动复制DLL和/或将全局“.tasks”文件放入其Visual Studio安装中吗


注意:MSBuild任务没有与项模板和项目模板相同的VSIX内容类型。我尝试过“VS Package”、“MEF Component”和“Custom Extension Type”,但似乎都不起作用。

我不相信您能做到这一点,因为VSIX软件包无法在任意位置安装文件,而且msbuild任务需要放在msbuild文件夹中。

visual studio 2017/2019的解决方案,这可能在2010年起作用(当时Microsoft.VisualStudio.TemplateWizard可用),即创建一个向导,并在替换字典中设置扩展安装位置的路径,并将模板中的替换项与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" />
公共类ProjectLocationWizard:IWizard
{
打开文件之前的公共无效(ProjectItem ProjectItem)
{
}
公共无效项目完成生成(项目)
{
}
公共无效项目完成生成(项目项目)
{
}
public void RunFinished()
{
}
public void RunStarted(对象自动对象、字典替换Dictionary、向导runKind runKind、对象[]customParams)
{
var wizardDirectory=Path.GetDirectoryName(Assembly.getExecutionGassembly().Location);
replacementsDictionary.Add(“$installlocation$”,向导目录);
}
公共bool ShouldAddProjectItem(字符串文件路径)
{
返回true;
}
}

在全驱动器搜索后,我在以下位置找到了我的DLL:C:\Documents and Settings\\Local Settings\Application Data\Microsoft\Visual Studio\10.0Exp\Extensions\\\\MyCustomTask.DLL这似乎是VSIX部署DLL的位置,但我找不到要在UsingTask AssemblyFile属性中使用的MSBuild变量。我找到了其他信息。你说得对。VSIX完全不支持这一点,文档中说应该使用常规的MSI安装包。请参阅:在“通过MSI安装”一节中,它指出MSBuild组件“必须位于特定的已知位置”,而VSIX不支持该位置。