4

Visual Studio 2010 用のカスタム アイテム テンプレートとプロジェクト テンプレートが多数あります。これらの拡張機能を複数の開発者のマシンに展開するために使用できる VSIX パッケージをビルドしました。

現在、新しいアイテム テンプレートに必要なカスタム MSBuild タスクを作成しています。

私のローカル プロジェクトでは、プロジェクト ファイルにハードコードされたパスを挿入することで、これを機能させることができます。

ただし、VSIX パッケージが 'dev' Visual Studio インスタンスにデプロイされている場合、これは機能しません。Visual Studio は、CustomBuildTask.dll が見つからないことを報告するだけです。

VSIX は DLL をどこに展開しますか? 他のマシンで DLL を見つけるために使用できる MSBuild %(path) 変数はありますか、それとも各ユーザーが手動で DLL をコピーしたり、グローバル ".tasks" ファイルを Visual Studio インストールに配置したりする必要がありますか?

注: MSBuild タスクには、アイテム テンプレートやプロジェクト テンプレートのような VSIX コンテンツ タイプはありません。「VS パッケージ」、「MEF コンポーネント」、および「カスタム拡張タイプ」を試しましたが、どれも機能していないようです。

4

2 に答える 2

1

VSIX パッケージは任意の場所にファイルをインストールできず、msbuild タスクは msbuild フォルダーに移動する必要があるため、これを行うことができるとは思いません。

于 2010-08-12T21:18:30.227 に答える
0

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" />
于 2020-07-11T12:14:36.643 に答える