Json 更改与重新加载文件行为
我有一个VSIX项目,它将对ASPNET5项目的project.json文件进行一些更改。我使用以下命令编辑.json文件Json 更改与重新加载文件行为,json,visual-studio,vsix,Json,Visual Studio,Vsix,我有一个VSIX项目,它将对ASPNET5项目的project.json文件进行一些更改。我使用以下命令编辑.json文件 ProjectJson jsonObj = JsonConvert.DeserializeObject<ProjectJson>(jsonContents); jsonObj = JsonConvert.DeserializeObject<ProjectJson>(jsonContents); var resultJson = JsonConver
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);
ProjectJson jsonObj=JsonConvert.DeserializeObject(jsonContents);
jsonObj=JsonConvert.DeserializeObject(jsonContents);
var resultJson=JsonConvert.serialized对象(jsonObj,Formatting.Indented);
JsonSerializer serializer=新的JsonSerializer();
使用(StreamWriter sw=新StreamWriter(projectObjects.ProjectJsonPath))
{
var writer=新的JsonTextWriter(sw);
serializer.Serialize(writer,resultJson);
}
//writealText(projectObjects.ProjectJsonPath,resultJson);
通过使用stream writer和writealltext,我在ASPNET 5项目中获得以下消息
该文件在此编辑器中有未保存的更改,并且已被更改
外部。你想重新加载它吗
如何在不获取上述消息的情况下编辑.json文件?这是您希望以编程方式检查的选项。我不知道你是如何做到这一点的,但你可以在MSDN(和)上找到有关设置的主题。使用这些主题,您可以了解如何创建选项 基本上,您需要做的是加载VS.settings文件(VS.vssettings)并插入另一行Xml。(查看MSDN上的设置文件部分) 更新 要非常清楚,VS设置文件位于 Documents\Your\u VS\u Version\Settings\CurrentSettings.vssettings 您需要加载xml并将“AutoloadExternalChanges”更改为值“true”。
其实恰恰相反。因为环境认为该文件要用未保存的更改重新加载 您应该取消选中“检测文件更改”。当您这样做时,它不会检测到外部更改,也不会警告您,但请注意,如果您在文件被修改后尝试保存文件,您将丢失外部更改。(我猜这在您的情况下不是问题),为了查看更改,您必须关闭,不保存文件并重新打开它 资料来源:
您需要告诉环境忽略文件更改。这可以使用和接口实现 下面是一个实用程序类(源自原始的Visual Studio 2010 SDK托管包框架示例,您仍然可以在此处找到:),它应该有帮助:
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);
}
}
}
}
公共类SuspendFileChanges:IDisposable
{
私有只读服务器ViceProvider\u服务提供商;
私有只读列表\u URL;
私有只读IVsDocDataFileChangeControl[]\u控件;
公共SuspendFileChanges(IServiceProvider服务提供程序,字符串url)
:此(serviceProvider,新字符串[]{url})
{
}
公共SuspendFileChanges(IServiceProvider服务提供程序,参数字符串[]URL)
{
if(serviceProvider==null)
抛出新的ArgumentNullException(“serviceProvider”);
如果(URL==null)
抛出新的ArgumentNullException(“URL”);
_服务提供者=服务提供者;
_URL=新列表(URL);
_controls=new IVsDocDataFileChangeControl[_url.Count];
//或者使用Package.GetGlobalService。。。
IVsRunningDocumentTable rdt=(IVsRunningDocumentTable)serviceProvider.GetService(typeof(SVsRunningDocumentTable));
IVsFileChangeEx fileChange=(IVsFileChangeEx)serviceProvider.GetService(typeof(SVsFileChangeEx));
对于(int i=0;i<\u url.Count;i++)
{
字符串url=url[i];
如果(url==null)
继续;
fileChange.IgnoreFile(0,url,1);
等级制度;
uint-itemId;
uint-docCookie;
IntPtr文档数据;
rdt.FindAndLockDocument((uint)_VSRDTFLAGS.rdt_NoLock、url、out层次结构、out itemId、out docData、out docCookie);
if(docData!=IntPtr.Zero)
{
_controls[i]=Marshal.GetObjectForIUnknown(docData)作为IVsDocDataFileChangeControl;
如果(_controls[i]!=null)
{
_控件[i]。IgnoreFileChanges(1);
}
封送放行(docData);
}
}
}
公共void Sync()
{
IVsFileChangeEx fileChange=(IVsFileChangeEx)_serviceProvider.GetService(typeof(SVsFileChangeEx));
if(fileChange==null)
抛出新的InvalidOperationException();
foreach(url中的字符串url)
{
如果(url==null)
继续;
fileChange.SyncFile(url);
}
}
公共空间处置()
{
IVsFileChangeEx fileChange=(IVsFileChangeEx)_serviceProvider.GetService(typeof(SVsFileChangeEx));
if(fileChange!=null)
{
foreach(url中的字符串url)
{
如果(url==null)
继续;
IgnoreFile(0,url,0);
}
}
foreach(IVsDocDataFileChangeControl控件在_控件中)
{
if(控件!=null)
{
控制。忽略文件更改(0);
}
}
}
}
Hi我找到了一种限制消息框的方法。从Visual Studio->工具->选项>文档。我已选中以下复选框。重新加载修改过的文件,除非有未保存的更改。有没有办法通过代码重新加载文件?我已经更新了我的问题。分享你的想法。如果您不知道如何通过代码实现这一点,我将为您提供一个实现。