Visual Studio工具VSIXInstaller

时间:2015-09-01 20:00:17

标签: c# .net visual-studio visual-studio-2015

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

我只在我的工作电脑上运行此异常。本机运行带有McAfee Antivirus,防火墙和驱动器加密的Windows 8.1。我觉得驱动器加密与此异常有关,但我不能肯定地说这个。

我调试了VSIXInstaller,发现了一些我认为是bug的东西。 该类是程序集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;
}

异常发生在AtomicallyDeleteFiles的File.Move中。我认为在那时我们打算使用File.Copy。该文件无法移动,因为它首先被锁定。

我无法确定的原因是,这只发生在我的McAfee计算机上。但是这里也报告了这个问题Can't Update or Uninstall NuGet Package Manager in VS2012http://www.paraesthesia.com/archive/2013/07/30/upgrading-nuget-the-process-cannot-access-the-file-because-it.aspx/

我不知道如何与Visual Studio团队取得联系。你会认为这也是一个错误吗?任何人都可以帮我报告这个吗?

此致 T4E

1 个答案:

答案 0 :(得分:0)

我认为向Visual Studio提供反馈的适当位置是Microsoft Connect。不幸的是,VS不是开源的,所以你不能提供拉取请求。我遇到了同样的问题,你的发现似乎很合理 - 虽然我的机器上也有迈克菲的事实是可疑的。