2017-08-15 5 views
1

Visual Studioツールバーにドロップダウンメニューを追加してカスタムMSBuildプロパティの値を制御するVSIX拡張機能を作成しようとしています。 この値は、プロジェクトに含めるCOMReferenceのバージョンを決定し、.csprojファイルを上書きせずに設定する必要があります。私.csprojファイルの一部:評価版MSBuildプロパティ値を使用してVisual Studio Intellisenseをプログラムで強制的に更新する

<Project ... > 
<Choose> 
    <When Condition="'$(MyProperty)'=='MyValue1'"> 
     <ItemGroup> 
     <COMReference Include="ComLib"> 
      Version_1 
     </COMReference> 
     </ItemGroup> 
    </When> 
    <When Condition="'$(MyProperty)'=='MyValue2'"> 
     <ItemGroup> 
     <COMReference Include="ComLib"> 
      Version_2 
     </COMReference> 
     </ItemGroup> 
    </When> 
    </Choose> 
</Project> 

は、私は2つの可能な解決策を見つけた:

まず

public static void SetGlobalBuildProperty(string property, string value) 
{ 
    var projects = Microsoft.Build.Evaluation.ProjectCollection 
       .GlobalProjectCollection 
       .LoadedProjects; 

    foreach (Microsoft.Build.Evaluation.Project project in projects) 
    { 
     project.SetGlobalProperty(property, value); 
     project.MarkDirty(); 
     project.ReevaluateIfNecessary();  
    } 
} 

Brojectは、実際の値で正しく構築するが、インテリセンスはそうCOMReferences から何かを認識しませんIntellisenseの機能は動作せず、すべて赤で下線が引かれています。

第二:

は別のファイルにプロパティを持参し、メインcsprojに含めます。 VSIX経由で.propsファイルを変更した後。

.csproj:

... 
<Include Project="generated\MyProps.props"/> 
<Coose> ... </Choose> 
... 

MyProps:

<Project ...> 
    <PropertyGroup> 
    <MyProperty Condition="'$(MyProperty)' == ''">MyValue1</MyProperty> 
    <DefineConstants>$(DefineConstants);$(MyProperty)</DefineConstants> 
    </PropertyGroup> 
</Project> 

このソリューションはひどく動作します。 MyValue1を変更すると、ソリューションエクスプローラでプロジェクトをリロードするだけでは不十分です。場合によってはVisual Studioを再起動するだけでは不十分で、.suoファイルを削除する必要があります。

Intellisenseでプロジェクトに関する情報を更新するにはどうすればよいですか、あるいはこの問題の別の解決策を知っている人がいますか?

答えて

1

解決策が見つかりました。 この機能の更新プロジェクトとインテリセンス:

VSLangProj80.VSProject2.Refresh(); 

のフル機能(溶液中のすべてのプロジェクトをリフレッシュします):

public static void SetGlobalBuildProperty(IServiceProvider package, string property, string value) 
    { 
     var projects = Microsoft.Build.Evaluation.ProjectCollection 
      .GlobalProjectCollection 
      .LoadedProjects; 

     foreach (var project in projects) 
     { 
      project.SetGlobalProperty(property, value); 
      project.MarkDirty(); 
      project.ReevaluateIfNecessary();      
     } 
     var dte = package.GetService(typeof(DTE)) as DTE2; 
     var solution = dte.Solution as Solution2; 
     var dteProjects = GetSolutionProjects(solution) //Get all solution projects. 
     foreach(var project in dteProjects) 
     { 
      var vsProject = project.Object as VSProject2; 
      vsproject.Refresh(); 
     }   
    } 
関連する問題