1

プログラムで .csproj ファイルにインポート タスクを追加しようとしていますが、これを行うために Microsoft.Build.BuildEngine オブジェクトを使用したくありません。これは、VS がプロジェクト ファイルが外部から変更されているという警告を表示するためです。ビジュアルスタジオ。

IVsBuildPropertyStorage インターフェイスを使用すると .csproj ファイルの MSBuild 部分にアクセスできると示唆しているページ [1] [2] をいくつか見ましたが、これを行う方法を理解するのに苦労しています。 . アクセスしたいプロパティの名前を指定する必要があるようですが、それを理解する方法がわかりません。「インポート」プロパティに対して GetPropertyValue() を呼び出しても、最終結果の外観が既に設定されているプロジェクト ファイルに対しては何も返されません。

EnvDTE.Project proj = ...;
var sol = Package.GetGlobalService(typeof(VsSolution)) as IVsSolution;
IVsHierarchy hier;
sol.GetProjectOfUniqueName(p.UniqueName, out hier);
var storage = hier as IVsBuildPropertyStorage;
string val;
storage.GetPropertyValue("Import", String.Empty,
                         (uint)_PersistStorageType.PST_PROJECT_FILE, out val);
// val is null

[1] https://mpfproj.svn.codeplex.com/svn/9.0/Tests/UnitTests/ProjectTest.cs
[2] http://social.msdn.microsoft.com/Forums/en-US/vsx/thread /e1983591-120a-4a2f-a910-e596dd625e68

ありがとう。これで得られる提案をいただければ幸いです。

4

2 に答える 2

5

同様の質問をしました ここを参照してくださいProgrammatically added and edit the Targets in a Visual Studio Project File プログラムでプロジェクト ファイルにインポートを追加するためにできることは、この名前空間http://msdn.microsoft.com/en-usを使用することです/library/microsoft.build.construction.aspx (GAC 内の) アセンブリ Microsoft.Build.dll からのものです。これは、約 3 ~ 4 ステップで実行できます。

以下は疑似コードです。

  1. DTE.ActiveSolutionProjects を使用してプロジェクト ファイルの場所を取得し、各プロジェクトのプロパティを取得します。FullPath と FileName を取得して、プロジェクト ファイルのフル パスを取得します。
  2. プロジェクト ファイルのフル パスを取得したら、ProjectRootElement.Open静的メソッドを呼び出します。

    ProjectRootElement project = ProjectRootElement.Open(projectPath);

  3. ProjectRootElement 参照を取得したら、AddImportメソッドを呼び出すことができます (名前はプロジェクト識別子属性です)。

    project.AddImport(名前)

それはそれを行う必要があります。

于 2010-12-22T20:01:20.083 に答える
1

Importelement はPropertyMSBuild の要素でもありませんItem

Importusing を追加できないと思いますIVsBuildPropertyStorage

于 2010-07-02T06:44:59.487 に答える