Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 更改与重新加载文件行为_Json_Visual Studio_Vsix - Fatal编程技术网

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

我有一个VSIX项目,它将对ASPNET5项目的project.json文件进行一些更改。我使用以下命令编辑.json文件

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->工具->选项>文档。我已选中以下复选框。重新加载修改过的文件,除非有未保存的更改。有没有办法通过代码重新加载文件?我已经更新了我的问题。分享你的想法。如果您不知道如何通过代码实现这一点,我将为您提供一个实现。