2015-11-15 9 views
7

私は1つのVSIXプロジェクトを持っています。これにより、ASPNET5プロジェクトのProject.jsonファイルにいくつかの変更が加えられます。以下を使用して.jsonファイルを編集しています。両方のストリームライターを使用してwritealltextはASPNET 5プロジェクトVSリロードファイルの動作を変更します

ファイルはこのエディタ内の保存されていない変更があり、外部から を変更されている中に、次のメッセージを取得していますによって

ProjectJson jsonObj = JsonConvert.DeserializeObject<ProjectJson>(jsonContents); 
jsonObj = JsonConvert.DeserializeObject<ProjectJson>(jsonContents); 

var resultJson = JsonConvert.SerializeObject(jsonObj, Formatting.Indented); 

JsonSerializer serializer = new JsonSerializer(); 
using (StreamWriter sw = new StreamWriter(projectObjects.ProjectJsonPath)) 
{ 
    var writer = new JsonTextWriter(sw); 
    serializer.Serialize(writer, resultJson); 
} 

// File.WriteAllText(projectObjects.ProjectJsonPath, resultJson); 

。それをリロードしますか?

上記のメッセージが表示されずに.jsonファイルを編集する方法はありますか?

+1

こんにちは メッセージボックスを制限する方法が見つかりました。 Visual Studio - >ツール - >オプション>ドキュメントの 次のチェックボックスをオンにしました。 変更が保存されていない限り、ファイルをリロードします。 ファイルをコードでリロードする方法はありますか? – user3610920

答えて

1

プログラムで確認するオプションです。どのように正確に行うことができるのかわかりませんが、MSDN(Creating an option pageCreating a setting category)で設定に関するトピックを見つけることができます。これらのトピックを使用して、オプションの作成方法を理解することができます。

基本的には、VS設定ファイル(VS.vssettings)を読み込んで別のXml行を挿入するだけです。

Option to deselect

アップデート(は、MSDN上の設定ファイルのセクションを調査を見てください)

VS設定ファイルが

の下に配置され、非常に明確にするために、 Documents \ Your_VS_Version \ Settings \ CurrentSettings.vssettings

xmlをロードし、 'AutoloadExternalChanges'を値 'true'に変更する必要があります。 Setting section

+1

私はこのトリックを知っていましたが、私はコードでこれを達成する必要があります。 – user3610920

+1

私は自分の質問を更新しました。考えを共有する。コードでこれを行う方法がわからない場合は、実装を提供します。 –

3

実際には反対です。環境は、ファイルが保存されていない変更を再ロードしたいと考えているからです。

検出ファイルの変更をオフにする必要があります。あなたがそうすると、外部の変更を検出することはなく、あなたに警告することはありません。ファイルが変更された後にファイルを保存しようとすると、外部の変更が失われます。推測)、そしてあなたが閉じる必要がある変更を見るために、ファイルを保存せずにそれを再び開く。

出典:VS2008: Disable asking whether to reload files changed outside the IDE

Disable file change detection

1

あなたは、ファイルの変更を無視するような環境を指示する必要があります。これは、IVsFileChangeExIVsDocDataFileChangeControlインターフェイスを使用して実現できます。助けてください。ここでは

は(http://www.getcodesamples.com/src/8641B4F/98B3955Eをあなたはまだここに見つけることができるオリジナルのVisual Studio 2010 SDK管理パッケージFrameworkのサンプル由来):ユーティリティクラスです

using (SuspendFileChanges suspend = new SuspendFileChanges(site, filePath)) 
{ 
    // do something with files 
    suspend.Sync(); // if you optionally want to tell the IDE it has changed 
} 

ユーティリティクラス:

public class SuspendFileChanges: IDisposable 
{ 
    private readonly IServiceProvider _serviceProvider; 
    private readonly List<string> _urls; 
    private readonly IVsDocDataFileChangeControl[] _controls; 

    public SuspendFileChanges(IServiceProvider serviceProvider, string url) 
     : this(serviceProvider, new string[] { url }) 
    { 
    } 

    public SuspendFileChanges(IServiceProvider serviceProvider, params string[] urls) 
    { 
     if (serviceProvider == null) 
      throw new ArgumentNullException("serviceProvider"); 

     if (urls == null) 
      throw new ArgumentNullException("urls"); 

     _serviceProvider = serviceProvider; 
     _urls = new List<string>(urls); 
     _controls = new IVsDocDataFileChangeControl[_urls.Count]; 

     // or use Package.GetGlobalService ... 
     IVsRunningDocumentTable rdt = (IVsRunningDocumentTable)serviceProvider.GetService(typeof(SVsRunningDocumentTable)); 
     IVsFileChangeEx fileChange = (IVsFileChangeEx)serviceProvider.GetService(typeof(SVsFileChangeEx)); 

     for(int i = 0; i < _urls.Count; i++) 
     { 
      string url = _urls[i]; 
      if (url == null) 
       continue; 

      fileChange.IgnoreFile(0, url, 1); 

      IVsHierarchy hierarchy; 
      uint itemId; 
      uint docCookie; 
      IntPtr docData; 
      rdt.FindAndLockDocument((uint)_VSRDTFLAGS.RDT_NoLock, url, out hierarchy, out itemId, out docData, out docCookie); 
      if (docData != IntPtr.Zero) 
      { 
       _controls[i] = Marshal.GetObjectForIUnknown(docData) as IVsDocDataFileChangeControl; 
       if (_controls[i] != null) 
       { 
        _controls[i].IgnoreFileChanges(1); 
       } 
       Marshal.Release(docData); 
      } 
     } 
    } 

    public void Sync() 
    { 
     IVsFileChangeEx fileChange = (IVsFileChangeEx)_serviceProvider.GetService(typeof(SVsFileChangeEx)); 
     if (fileChange == null) 
      throw new InvalidOperationException(); 

     foreach (string url in _urls) 
     { 
      if (url == null) 
       continue; 

      fileChange.SyncFile(url); 
     } 
    } 

    public void Dispose() 
    { 
     IVsFileChangeEx fileChange = (IVsFileChangeEx)_serviceProvider.GetService(typeof(SVsFileChangeEx)); 
     if (fileChange != null) 
     { 
      foreach (string url in _urls) 
      { 
       if (url == null) 
        continue; 

       fileChange.IgnoreFile(0, url, 0); 
      } 
     } 

     foreach (IVsDocDataFileChangeControl control in _controls) 
     { 
      if (control != null) 
      { 
       control.IgnoreFileChanges(0); 
      } 
     } 
    } 
} 
関連する問題