Я портирую через небольшое консольное приложение, которое удаляет файлы на диске, которых нет в проекте Visual Studio.Этот код работал в Visual Studio 2013, но я получаю следующую ошибку при запуске в Visual Studio 2017:
System.Runtime.InteropServices.COMException: 'TheФильтр сообщений показал, что приложение занято.(Исключение из HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER)) '
Текущий код:
public static int DeleteFilesNotInProject(string solutionFileAndPath, string projectName, string extension)
{
var returnValue = 0;
EnvDTE80.DTE2 dte;
// Targets Visual Studio 2017
dte = (EnvDTE80.DTE2)Activator.CreateInstance(Type.GetTypeFromProgID("VisualStudio.DTE.15.0", true), true);
MessageFilter.Register();
System.Threading.Thread.Sleep(2000);
while (!dte.Solution.IsOpen)
{
// make sure it is ready to open
System.Threading.Thread.Sleep(500);
dte.Solution.Open(solutionFileAndPath);
}
dte.Solution.Open(solutionFileAndPath);
System.Threading.Thread.Sleep(5000);
foreach (Project project in dte.Solution.Projects)
{
if (project.UniqueName.EndsWith(projectName))
foreach (string s in GetFilesNotInProject(project, extension))
{
FileInfo fi = new FileInfo(s);
File.SetAttributes(s, FileAttributes.Normal);
File.Delete(s);
returnValue++;
}
}
dte.Quit();
MessageFilter.Revoke();
return returnValue;
}
Исключение выдается в строке while (!dte.Solution.IsOpen)
.Я попытался закомментировать это, а затем вместо этого в строку foreach (Project project in dte.Solution.Projects)
.
Примечания:
- Код основан на этой статье MSDN .Я хочу сохранить это в консольном приложении.
- Я обнаружил PowerShell и VS Addons / Extensions, но мне интересно сохранить этот класс C #, называемый в составе консольного приложения.
- Я попытался использовать только EnvDTE вместо EnvDTE80, но получил ту же ошибку.