0

nugetのインストール中に、ユーザーが実行できるコマンドをユーザーに提供します。このコマンドは基本的にいくつかのファイルをスキャンし、いくつかのコードテンプレートを作成してから、それらを現在のプロジェクトに挿入します。ソリューションエクスプローラーが新しいファイルでツリービューを更新しないという事実を除いて、これは問題なく機能します。プロジェクトファイルをアンロードおよびリロードでき、ファイルがそこにあるので、これが機能することはわかっています。

役立つ場合は、プロジェクトにファイルを追加するために使用するコードを次に示します。2番目の関数は、ユーザーが実際に呼び出すものです。

function add-to-project ($itemType, $project)
{
  process
  {
    $bogus = $project.Xml.AddItem($itemType, $_)
  }
}

# Parse a file
function Write-TTree-MetaData ($Path = $(throw "-Path must be supplied"))
{
  $p = Get-Project
  Write-Host "Inserting the results of the parsing into project" $p.Name
  $ms = Get-MSBuildProject

  $destDir = ([System.IO.FileInfo] $p.FullName).Directory

  # Run the parse now

  CmdTFileParser -d $destDir.FullName $Path

  # Now, attempt to insert them all into the project

  $allFiles = Get-ChildItem -Path $destDir.FullName
  $allFiles | ? {$_.Extension -eq ".ntup"} | add-to-project "TTreeGroupSpec" $ms
  $allFiles | ? {$_.Extension -eq ".ntupom"} | add-to-project "ROOTFileDataModel" $ms

  # Make sure everything is saved!

  $ms.Save()
  $p.Save()
}

このコードにより、面白いダイアログがポップアップ表示されます-「プロジェクトはディスク上で変更されました-リロードしてください」-そしてうまくいけば、ユーザーがリロードすると、ファイルが正しく表示されます...しかし、それを避けて、スクリプトに必要なことを何でも起こさせます。おそらく、プロジェクトをアンロードして再ロードする方法を理解する必要がありますか?

ソリューションエクスプローラーを強制的に更新するにはどうすればよいですか?どうもありがとう!

4

1 に答える 1

0

MSBuild プロジェクトを使用することで、Visual Studio をバイパスし、ディスク上の MSBuild プロジェクト ファイルを直接更新します。Visual Studio でソリューション エクスプローラー ウィンドウを更新する最も簡単な方法は、Get-Project コマンドから取得する代わりに、Visual Studio プロジェクト オブジェクトを使用することです。

以下は、ソリューションにファイルを追加し、その ItemType を ROOTFileDataModel に変更する簡単な例です。この例では、プロジェクトのルート ディレクトリに packages.config ファイルがあることを前提としていますが、これは現在プロジェクトに追加されていないため、最初はソリューション エクスプローラーに表示されません。

# Get project's root directory.
$p = Get-Project
$projectDir = [System.IO.Path]::GetDirectoryName($p.FileName)

# Add packages.config file to project. Should appear in Solution Explorer
$newFile = [System.IO.Path]::Combine($projectDir, "packages.config")
$projectItem = $p.ProjectItems.AddFromFile($newFile)

# Change file's ItemType to ROOTFileDataModel
$itemType = $projectItem.Properties.Item("ItemType")
$itemType.Value = "ROOTFileDataModel"

# Save the project.
$p.Save()

ここで使用されている主な Visual Studio オブジェクトは、ProjectProjectItem、およびProjectItemsオブジェクトです。上記のコードが特定の要件に適合することを願っています。

于 2011-10-09T11:00:54.913 に答える