Visual Studio Tool VSIXInstaller中可能存在的bug

本文关键字:存在 bug Studio Tool VSIXInstaller Visual | 更新日期: 2023-09-27 18:10:48

当我想在Visual Studio 2015中更新扩展时,我正在异常运行。每次我更新一个扩展,我会得到一个文件已经在使用异常。我追踪到*.pkgdef文件。

我只在我的工作pc上运行此异常。这台机器运行Windows 8.1,带有McAfee防病毒、防火墙和驱动器加密。我有一种感觉,驱动器加密与这个异常有关,但我不能肯定。

我调试了VSIXInstaller,发现了一些我认为是错误的东西。这个类是在Microsoft.VisualStudio.ExtensionManager.Implementation.dll中的ExtensionManagerService.cs。

private void AtomicallyDeleteFiles(IEnumerable<string> filePaths, bool justMarkForDeletion)
{
  foreach (FileStream fileStream in this.LockFiles(filePaths, (IList<string>) null))
  {
    if (justMarkForDeletion)
    {
      string str = fileStream.Name + ".deleteme";
      File.Delete(str);
      File.Move(fileStream.Name, str);
    }
    else
      File.Delete(fileStream.Name);
    fileStream.Close();
  }
}

LockFiles方法的实现如下:

private IEnumerable<FileStream> LockFiles(IEnumerable<string> filePaths, IList<string> inUse = null)
{
  List<FileStream> list = new List<FileStream>();
  foreach (string path in filePaths)
  {
    try
    {
      FileAttributes attributes = File.GetAttributes(path);
      if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
      {
        FileAttributes fileAttributes = attributes & ~FileAttributes.ReadOnly;
        File.SetAttributes(path, fileAttributes);
      }
      FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Write, FileShare.Delete);
      list.Add(fileStream);
    }
    catch (Exception ex)
    {
      if (ex is FileNotFoundException)
      {
        try
        {
          Registry.SetValue("HKEY_LOCAL_MACHINE''Software''Microsoft''VisualStudio''Extensibility''ExtensionSDKDeletionListStore''", "ScanForDeleteMeExtensionSDKsAtStartup", (object) 1, RegistryValueKind.DWord);
          Registry.SetValue("HKEY_CURRENT_USER''Software''Microsoft''VisualStudio''Extensibility''ExtensionSDKDeletionListStore''", "ScanForDeleteMeExtensionSDKsAtStartup", (object) 1, RegistryValueKind.DWord);
        }
        catch
        {
        }
      }
      if (inUse == null)
      {
        foreach (Stream stream in list)
          stream.Close();
        throw;
      }
      else
        inUse.Add(path);
    }
  }
  return (IEnumerable<FileStream>) list;
}

异常发生在File。移动到AtomicallyDeleteFiles。我认为在那一点上,一个文件。副本是要被使用的。

文件不能移动,因为它一开始就被锁定了。

我不能确定的是为什么这只发生在我的McAfee机器上。但是这个问题也报告在这里Can't更新或卸载NuGet包管理器在VS2012和这里http://www.paraesthesia.com/archive/2013/07/30/upgrading-nuget-the-process-cannot-access-the-file-because-it.aspx/。

我不知道如何与Visual Studio团队取得联系。你会认为这也是一个bug吗?谁能帮我报告一下这个?

的问候T4E

Visual Studio Tool VSIXInstaller中可能存在的bug

我认为把反馈放到Visual Studio的合适位置是Microsoft Connect。不幸的是,VS不是开源的,所以你不能向他们提供拉请求。我也遇到过同样的问题,你的发现似乎是合理的——尽管我的电脑上也安装了McAfee,这一事实令人怀疑。