aboutsummaryrefslogtreecommitdiffstats
path: root/QtVsTools.Core
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@qt.io>2022-02-07 10:06:53 +0100
committerKarsten Heimrich <karsten.heimrich@qt.io>2022-02-09 18:53:04 +0000
commit57a23fdb7aece0143663d4216baa28765031ca5b (patch)
tree5deadcc377b5dc6da87ea7b775d174d3167482c7 /QtVsTools.Core
parent9d2d7aaf63f309aa2b42273bad3b05c40f848515 (diff)
Fix warning: Add ThreadHelper.ThrowIfNotOnUIThread();
Change-Id: I8e7cc3a16eb5b303823ea5b1c85e04f5ce85947b Reviewed-by: Miguel Costa <miguel.costa@qt.io>
Diffstat (limited to 'QtVsTools.Core')
-rw-r--r--QtVsTools.Core/HelperFunctions.cs64
-rw-r--r--QtVsTools.Core/MainWinWrapper.cs2
-rw-r--r--QtVsTools.Core/Messages.cs29
-rw-r--r--QtVsTools.Core/MsBuildProject.cs8
-rw-r--r--QtVsTools.Core/ProjectExporter.cs33
-rw-r--r--QtVsTools.Core/ProjectImporter.cs14
-rw-r--r--QtVsTools.Core/QMake.cs15
-rw-r--r--QtVsTools.Core/QMakeConf.cs3
-rw-r--r--QtVsTools.Core/QMakeQuery.cs16
-rw-r--r--QtVsTools.Core/QtModules.cs2
-rw-r--r--QtVsTools.Core/QtProject.cs149
-rw-r--r--QtVsTools.Core/QtVSIPSettings.cs50
-rw-r--r--QtVsTools.Core/QtVersionManager.cs50
-rw-r--r--QtVsTools.Core/RccOptions.cs13
-rw-r--r--QtVsTools.Core/VersionInformation.cs4
-rw-r--r--QtVsTools.Core/WaitDialog.cs14
16 files changed, 425 insertions, 41 deletions
diff --git a/QtVsTools.Core/HelperFunctions.cs b/QtVsTools.Core/HelperFunctions.cs
index 1327a864..df92470b 100644
--- a/QtVsTools.Core/HelperFunctions.cs
+++ b/QtVsTools.Core/HelperFunctions.cs
@@ -27,6 +27,7 @@
****************************************************************************/
using EnvDTE;
+using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.VCProjectEngine;
#if VS2017
using Microsoft.Win32;
@@ -95,16 +96,19 @@ namespace QtVsTools.Core
static public void SetDebuggingEnvironment(Project prj)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
SetDebuggingEnvironment(prj, string.Empty);
}
static public void SetDebuggingEnvironment(Project prj, string solutionConfig)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
SetDebuggingEnvironment(prj, "PATH=$(QTDIR)\\bin;$(PATH)", false, solutionConfig);
}
static public void SetDebuggingEnvironment(Project prj, string envpath, bool overwrite)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
SetDebuggingEnvironment(prj, envpath, overwrite, string.Empty);
}
@@ -113,6 +117,8 @@ namespace QtVsTools.Core
if (QtProject.GetFormatVersion(prj) >= Resources.qtMinFormatVersion_Settings)
return;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
// Get platform name from given solution configuration
// or if not available take the active configuration
var activePlatformName = string.Empty;
@@ -174,8 +180,9 @@ namespace QtVsTools.Core
public static bool IsProjectInSolution(DTE dteObject, string fullName)
{
- var fi = new FileInfo(fullName);
+ ThreadHelper.ThrowIfNotOnUIThread();
+ var fi = new FileInfo(fullName);
foreach (var p in ProjectsInSolution(dteObject)) {
if (p.FullName.ToLower() == fi.FullName.ToLower())
return true;
@@ -336,6 +343,8 @@ namespace QtVsTools.Core
/// <returns></returns>
public static void ReplaceInCustomBuildTools(Project project, string oldString, string replaceString)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var vcPro = (VCProject)project.Object;
if (vcPro == null)
return;
@@ -410,6 +419,8 @@ namespace QtVsTools.Core
/// <param name="projectItem">Project Item which needs to have custom build tool</param>
static public void EnsureCustomBuildToolAvailable(ProjectItem projectItem)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
foreach (Property prop in projectItem.Properties) {
if (prop.Name == "ItemType") {
if ((string)prop.Value != "CustomBuild")
@@ -447,7 +458,8 @@ namespace QtVsTools.Core
if (QtProject.GetFormatVersion(project) >= Resources.qtMinFormatVersion_Settings)
return;
- string qtDir = null;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var vcPro = (VCProject)project.Object;
if (!IsQMakeProject(project))
return;
@@ -455,7 +467,7 @@ namespace QtVsTools.Core
// TODO: qtPro is never used.
var qtPro = QtProject.Create(project);
var vm = QtVersionManager.The();
- qtDir = vm.GetInstallPath(project);
+ string qtDir = vm.GetInstallPath(project);
foreach (var global in (string[])project.Globals.VariableNames) {
if (global.StartsWith("Qt5Version", StringComparison.Ordinal))
@@ -485,7 +497,7 @@ namespace QtVsTools.Core
ReplaceInCustomBuildTools(project, "$(QTDIR)", qtDir);
} else {
- qtDir = GetQtDirFromQMakeProject(project);
+ string qtDir = GetQtDirFromQMakeProject(project);
var vm = QtVersionManager.The();
var qtVersion = vm.GetQtVersionFromInstallDir(qtDir);
@@ -558,6 +570,8 @@ namespace QtVsTools.Core
/// <param name="project">The project is needed to convert relative paths to absolute paths.</param>
private static void ReplaceDirectory(ref List<string> paths, string oldDirectory, string replacement, Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
for (var i = 0; i < paths.Count; ++i) {
var dirName = paths[i];
if (dirName.StartsWith("\"", StringComparison.Ordinal) && dirName.EndsWith("\"", StringComparison.Ordinal)) {
@@ -582,6 +596,8 @@ namespace QtVsTools.Core
public static string GetQtDirFromQMakeProject(Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var vcProject = project.Object as VCProject;
if (vcProject == null)
return null;
@@ -674,6 +690,8 @@ namespace QtVsTools.Core
if (QtProject.GetFormatVersion(proj) >= Resources.qtMinFormatVersion_Settings)
return true;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var envPro = proj.Object as Project;
if (envPro.Globals == null || envPro.Globals.VariableNames == null)
return false;
@@ -691,6 +709,7 @@ namespace QtVsTools.Core
/// <param name="proj">project</param>
public static bool IsQtProject(Project proj)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
try {
if (proj != null && proj.Kind == "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}")
return IsQtProject(proj.Object as VCProject);
@@ -723,6 +742,7 @@ namespace QtVsTools.Core
/// <param name="proj">project</param>
public static bool IsQMakeProject(Project proj)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
try {
if (proj != null && proj.Kind == "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}")
return IsQMakeProject(proj.Object as VCProject);
@@ -732,6 +752,8 @@ namespace QtVsTools.Core
public static void CleanupQMakeDependencies(Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var vcPro = (VCProject)project.Object;
// clean up qmake mess
var rxp1 = new Regex("\\bQt\\w+d?5?\\.lib\\b");
@@ -904,6 +926,8 @@ namespace QtVsTools.Core
if (string.IsNullOrEmpty(nodeToCollapseFilter))
return;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
foreach (UIHierarchyItem innerItem in item.UIHierarchyItems) {
if (innerItem.Name == nodeToCollapseFilter)
CollapseFilter(innerItem, hierarchy);
@@ -914,6 +938,8 @@ namespace QtVsTools.Core
public static void CollapseFilter(UIHierarchyItem item, UIHierarchy hierarchy)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var subItems = item.UIHierarchyItems;
if (subItems != null) {
foreach (UIHierarchyItem innerItem in subItems) {
@@ -962,7 +988,7 @@ namespace QtVsTools.Core
public static List<string> GetProjectFiles(Project pro, FilesToList filter)
{
- var fileList = new List<string>();
+ ThreadHelper.ThrowIfNotOnUIThread();
VCProject vcpro;
try {
@@ -972,6 +998,7 @@ namespace QtVsTools.Core
return null;
}
+ var fileList = new List<string>();
var configurationName = pro.ConfigurationManager.ActiveConfiguration.ConfigurationName;
foreach (VCFile vcfile in (IVCCollection)vcpro.Files) {
@@ -1040,6 +1067,8 @@ namespace QtVsTools.Core
/// <param name="fileName"></param>
public static void RemoveFileInProject(VCProject vcpro, string fileName)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var qtProj = QtProject.Create(vcpro);
var fi = new FileInfo(fileName);
@@ -1055,6 +1084,9 @@ namespace QtVsTools.Core
{
if (dteObject == null)
return null;
+
+ ThreadHelper.ThrowIfNotOnUIThread();
+
Array prjs = null;
try {
prjs = (Array)dteObject.ActiveSolutionProjects;
@@ -1073,6 +1105,8 @@ namespace QtVsTools.Core
public static Project GetActiveDocumentProject(DTE dteObject)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (dteObject == null)
return null;
var doc = dteObject.ActiveDocument;
@@ -1087,6 +1121,8 @@ namespace QtVsTools.Core
public static Project GetSingleProjectInSolution(DTE dteObject)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var projectList = ProjectsInSolution(dteObject);
if (dteObject == null || dteObject.Solution == null ||
projectList.Count != 1)
@@ -1102,6 +1138,8 @@ namespace QtVsTools.Core
/// </summary>
public static Project GetSelectedQtProject(DTE dteObject)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
// can happen sometimes shortly after starting VS
if (dteObject == null || dteObject.Solution == null
|| ProjectsInSolution(dteObject).Count == 0)
@@ -1121,6 +1159,8 @@ namespace QtVsTools.Core
if (GetSelectedQtProject(dteObject) == null)
return null;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (dteObject.SelectedItems.Count <= 0)
return null;
@@ -1159,6 +1199,8 @@ namespace QtVsTools.Core
public static RccOptions ParseRccOptions(string cmdLine, VCFile qrcFile)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var pro = VCProjectToProject((VCProject)qrcFile.project);
var rccOpts = new RccOptions(pro, qrcFile);
@@ -1181,11 +1223,14 @@ namespace QtVsTools.Core
public static Project VCProjectToProject(VCProject vcproj)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
return (Project)vcproj.Object;
}
public static List<Project> ProjectsInSolution(DTE dteObject)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var projects = new List<Project>();
var solution = dteObject.Solution;
if (solution != null) {
@@ -1207,6 +1252,8 @@ namespace QtVsTools.Core
private static void addSubProjects(Project prj, ref List<Project> projects)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
// If the actual object of the project is null then the project was probably unloaded.
if (prj.Object == null)
return;
@@ -1226,6 +1273,8 @@ namespace QtVsTools.Core
if (subItems == null)
return;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
foreach (ProjectItem item in subItems) {
Project subprj = null;
try {
@@ -1358,13 +1407,14 @@ namespace QtVsTools.Core
string platformName,
string filePath = null)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (project == null
|| string.IsNullOrEmpty(configName)
|| string.IsNullOrEmpty(platformName))
return false;
var vcProject = project.Object as VCProject;
-
if (filePath == null) {
var vcConfig = (from VCConfiguration _config
in (IVCCollection)vcProject.Configurations
@@ -1620,6 +1670,8 @@ namespace QtVsTools.Core
public static bool SetVCVars(VersionInformation VersionInfo, ProcessStartInfo startInfo)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (VersionInfo == null) {
VersionInfo = QtVersionManager.The().GetVersionInfo(
QtVersionManager.The().GetDefaultVersion());
diff --git a/QtVsTools.Core/MainWinWrapper.cs b/QtVsTools.Core/MainWinWrapper.cs
index f8beb439..2880bd06 100644
--- a/QtVsTools.Core/MainWinWrapper.cs
+++ b/QtVsTools.Core/MainWinWrapper.cs
@@ -44,6 +44,8 @@ namespace QtVsTools.Core
{
get
{
+ Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread();
+
if (dteObject != null)
#if VS2022
return dteObject.MainWindow.HWnd;
diff --git a/QtVsTools.Core/Messages.cs b/QtVsTools.Core/Messages.cs
index 7eb46ab0..c00208d6 100644
--- a/QtVsTools.Core/Messages.cs
+++ b/QtVsTools.Core/Messages.cs
@@ -31,11 +31,14 @@ using System.Collections.Concurrent;
using System.Diagnostics;
using System.Linq;
using System.Threading;
-using Thread = System.Threading.Thread;
using System.Windows.Forms;
using System.Threading.Tasks;
using Microsoft.VisualStudio.Threading;
using QtVsTools.VisualStudio;
+using Microsoft.VisualStudio.Shell;
+
+using Thread = System.Threading.Thread;
+using Task = System.Threading.Tasks.Task;
namespace QtVsTools.Core
{
@@ -49,8 +52,13 @@ namespace QtVsTools.Core
{
get
{
+ ThreadHelper.ThrowIfNotOnUIThread();
return _BuildPane ?? (_BuildPane = Window.OutputWindowPanes.Cast<OutputWindowPane>()
- .Where(pane => pane.Guid == "{1BD8A850-02D1-11D1-BEE7-00A0C913D1F8}")
+ .Where(pane =>
+ {
+ ThreadHelper.ThrowIfNotOnUIThread();
+ return pane.Guid == "{1BD8A850-02D1-11D1-BEE7-00A0C913D1F8}";
+ })
.FirstOrDefault());
}
}
@@ -66,11 +74,14 @@ namespace QtVsTools.Core
Text = text,
Activate = activate
});
+
+ ThreadHelper.ThrowIfNotOnUIThread();
FlushMessages();
}
static void OutputWindowPane_Print(string text)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
OutputWindowPane_Init();
Pane.OutputString(text + "\r\n");
// show buildPane if a build is in progress
@@ -87,12 +98,17 @@ namespace QtVsTools.Core
{
Activate = true
});
+
+ ThreadHelper.ThrowIfNotOnUIThread();
FlushMessages();
}
static void OutputWindowPane_Activate()
{
OutputWindowPane_Init();
+
+ ThreadHelper.ThrowIfNotOnUIThread();
+
Pane?.Activate();
}
@@ -155,12 +171,18 @@ namespace QtVsTools.Core
{
Clear = true
});
+
+ ThreadHelper.ThrowIfNotOnUIThread();
+
FlushMessages();
}
static void OutputWindowPane_Clear()
{
OutputWindowPane_Init();
+
+ ThreadHelper.ThrowIfNotOnUIThread();
+
Pane?.Clear();
}
@@ -185,6 +207,9 @@ namespace QtVsTools.Core
if (Dte == null)
Dte = VsServiceProvider.GetService<DTE>();
var t = Stopwatch.StartNew();
+
+ ThreadHelper.ThrowIfNotOnUIThread();
+
while (Pane == null && t.ElapsedMilliseconds < 5000) {
try {
Window = Dte.Windows.Item(Constants.vsWindowKindOutput).Object as OutputWindow;
diff --git a/QtVsTools.Core/MsBuildProject.cs b/QtVsTools.Core/MsBuildProject.cs
index 83b0cda0..187382a2 100644
--- a/QtVsTools.Core/MsBuildProject.cs
+++ b/QtVsTools.Core/MsBuildProject.cs
@@ -39,6 +39,7 @@ using Microsoft.Build.Construction;
using Microsoft.Build.Execution;
using Microsoft.Build.Evaluation;
using QtVsTools.SyntaxAnalysis;
+using Microsoft.VisualStudio.Shell;
namespace QtVsTools.Core
{
@@ -288,6 +289,8 @@ namespace QtVsTools.Core
/// <returns>true if successful</returns>
public bool UpdateProjectFormatVersion()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (ConfigCondition == null)
return false;
@@ -910,6 +913,9 @@ namespace QtVsTools.Core
var projPath = this[Files.Project].filePath;
bool error = false;
+
+ ThreadHelper.ThrowIfNotOnUIThread();
+
using (var evaluator = new MSBuildEvaluator(this[Files.Project])) {
foreach (var row in query) {
@@ -1202,6 +1208,8 @@ namespace QtVsTools.Core
//remove .moc.cbt CustomBuild items
cbtToRemove.ForEach(x => x.Remove());
+ ThreadHelper.ThrowIfNotOnUIThread();
+
//convert moc custom build steps
var mocCustomBuilds = GetCustomBuilds(QtMoc.ToolExecName);
if (!SetCommandLines(qtMsBuild, configurations, mocCustomBuilds,
diff --git a/QtVsTools.Core/ProjectExporter.cs b/QtVsTools.Core/ProjectExporter.cs
index df8b7105..55d8c36e 100644
--- a/QtVsTools.Core/ProjectExporter.cs
+++ b/QtVsTools.Core/ProjectExporter.cs
@@ -28,6 +28,7 @@
using EnvDTE;
using EnvDTE80;
+using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.VCProjectEngine;
using System;
using System.Collections;
@@ -94,6 +95,8 @@ namespace QtVsTools.Core
ProFileContent content;
var prosln = new ProSolution(sln);
+ ThreadHelper.ThrowIfNotOnUIThread();
+
foreach (var proj in HelperFunctions.ProjectsInSolution(sln.DTE)) {
try {
// only add qt projects
@@ -113,6 +116,8 @@ namespace QtVsTools.Core
private void addProjectsInFolder(Project solutionFolder, ProSolution sln)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
foreach (ProjectItem pi in solutionFolder.ProjectItems) {
var containedProject = pi.Object as Project;
if (HelperFunctions.IsQtProject(containedProject)) {
@@ -130,6 +135,8 @@ namespace QtVsTools.Core
var qtPro = QtProject.Create(project);
var content = new ProFileContent(qtPro.VCProject);
+ ThreadHelper.ThrowIfNotOnUIThread();
+
// hack to get active config
var activeConfig = project.ConfigurationManager.ActiveConfiguration.ConfigurationName;
var activePlatform = project.ConfigurationManager.ActiveConfiguration.PlatformName;
@@ -343,6 +350,8 @@ namespace QtVsTools.Core
private static ProFileContent CreatePriFileContent(Project project, string priFileDirectory)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
ProFileOption option;
var qtPro = QtProject.Create(project);
var content = new ProFileContent(qtPro.VCProject);
@@ -432,6 +441,8 @@ namespace QtVsTools.Core
qtDir = HelperFunctions.NormalizeRelativeFilePath(qtDir);
+ ThreadHelper.ThrowIfNotOnUIThread();
+
foreach (var s in includePaths.Split(';', ',')) {
var d = HelperFunctions.NormalizeRelativeFilePath(s);
if (!d.StartsWith("$(qtdir)\\include", StringComparison.OrdinalIgnoreCase) &&
@@ -461,9 +472,10 @@ namespace QtVsTools.Core
qtDir = Environment.GetEnvironmentVariable("QTDIR");
if (qtDir == null)
qtDir = "";
-
qtDir = HelperFunctions.NormalizeRelativeFilePath(qtDir);
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (paths != null) {
foreach (var s in paths.Split(';', ',')) {
var d = HelperFunctions.NormalizeRelativeFilePath(s);
@@ -491,6 +503,8 @@ namespace QtVsTools.Core
private static void AddModules(QtProject qtPrj, ProFileOption optionQT, ProFileOption optionCONFIG)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
foreach (var module in QtModules.Instance.GetAvailableModules()) {
if (!qtPrj.HasModule(module.Id))
continue;
@@ -504,6 +518,8 @@ namespace QtVsTools.Core
private void WriteProSolution(ProSolution prosln, bool openFile)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var sln = prosln.ProjectSolution;
if (string.IsNullOrEmpty(sln.FileName))
return;
@@ -605,8 +621,8 @@ namespace QtVsTools.Core
WriteProFileOptions(sw, content.Options);
}
- // open the file in vs
- if (openFile)
+ ThreadHelper.ThrowIfNotOnUIThread();
+ if (openFile) // open the file in vs
dteObject.OpenFile(Constants.vsViewKindTextView, proFile).Activate();
}
@@ -714,6 +730,8 @@ namespace QtVsTools.Core
foreach (var s in projFiles)
cmpProjFiles.Add(HelperFunctions.NormalizeFilePath(s).ToLower());
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var qtPro = QtProject.Create(vcproj);
var filterPathTable = new Hashtable(17);
var pathFilterTable = new Hashtable(17);
@@ -779,7 +797,7 @@ namespace QtVsTools.Core
public void ExportToProFile()
{
- var expDlg = new ExportProjectDialog();
+ ThreadHelper.ThrowIfNotOnUIThread();
var sln = dteObject.Solution;
var prosln = CreateProFileSolution(sln);
@@ -789,6 +807,7 @@ namespace QtVsTools.Core
return;
}
+ var expDlg = new ExportProjectDialog();
expDlg.ProFileSolution = prosln;
expDlg.StartPosition = FormStartPosition.CenterParent;
var ww = new MainWinWrapper(dteObject);
@@ -814,8 +833,9 @@ namespace QtVsTools.Core
public string ExportToPriFile(Project proj)
{
- VCProject vcproj;
+ ThreadHelper.ThrowIfNotOnUIThread();
+ VCProject vcproj;
if (HelperFunctions.IsQtProject(proj)) {
try {
vcproj = (VCProject)proj.Object;
@@ -844,8 +864,9 @@ namespace QtVsTools.Core
public void ExportToPriFile(Project proj, string fileName)
{
- var priFile = new FileInfo(fileName);
+ ThreadHelper.ThrowIfNotOnUIThread();
+ var priFile = new FileInfo(fileName);
var content = CreatePriFileContent(proj, priFile.DirectoryName);
WritePriFile(content, priFile.FullName);
}
diff --git a/QtVsTools.Core/ProjectImporter.cs b/QtVsTools.Core/ProjectImporter.cs
index c9885d7a..ea72953f 100644
--- a/QtVsTools.Core/ProjectImporter.cs
+++ b/QtVsTools.Core/ProjectImporter.cs
@@ -27,6 +27,7 @@
****************************************************************************/
using EnvDTE;
+using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.VCProjectEngine;
using System;
using System.Collections.Generic;
@@ -56,6 +57,8 @@ namespace QtVsTools.Core
if (DialogResult.OK != toOpen.ShowDialog())
return;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var mainInfo = new FileInfo(toOpen.FileName);
if (HelperFunctions.IsSubDirsFile(mainInfo.FullName)) {
// we use the safe way. Make the user close the existing solution manually
@@ -84,6 +87,8 @@ namespace QtVsTools.Core
return;
ImportQMakeSolution(VCInfo, versionInfo);
+ ThreadHelper.ThrowIfNotOnUIThread();
+
try {
if (CheckQtVersion(versionInfo)) {
dteObject.Solution.Open(VCInfo.FullName);
@@ -113,6 +118,7 @@ namespace QtVsTools.Core
ImportQMakeProject(VCInfo, versionInfo);
+ ThreadHelper.ThrowIfNotOnUIThread();
try {
if (CheckQtVersion(versionInfo)) {
// no need to add the project again if it's already there...
@@ -179,6 +185,9 @@ namespace QtVsTools.Core
private void ImportQMakeSolution(FileInfo solutionFile, VersionInformation vi)
{
var projects = ParseProjectsFromSolution(solutionFile);
+
+ ThreadHelper.ThrowIfNotOnUIThread();
+
foreach (var project in projects) {
var projectInfo = new FileInfo(project);
ImportQMakeProject(projectInfo, vi);
@@ -205,6 +214,8 @@ namespace QtVsTools.Core
private void ImportQMakeProject(FileInfo projectFile, VersionInformation vi)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var xmlProject = MsBuildProject.Load(projectFile.FullName);
xmlProject.ReplacePath(vi.qtDir, "$(QTDIR)");
xmlProject.ReplacePath(projectFile.DirectoryName, ".");
@@ -241,6 +252,7 @@ namespace QtVsTools.Core
qtProject.CollapseFilter(Filters.ResourceFiles().Name);
qtProject.CollapseFilter(Filters.GeneratedFiles().Name);
+ ThreadHelper.ThrowIfNotOnUIThread();
try {
// save the project after modification
qtProject.Project.Save(null);
@@ -249,6 +261,8 @@ namespace QtVsTools.Core
private FileInfo RunQmake(FileInfo mainInfo, string ext, bool recursive, VersionInformation vi)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var name = mainInfo.Name.Remove(mainInfo.Name.IndexOf('.'));
var VCInfo = new FileInfo(mainInfo.DirectoryName + "\\" + name + ext);
diff --git a/QtVsTools.Core/QMake.cs b/QtVsTools.Core/QMake.cs
index 07101389..7ea1be88 100644
--- a/QtVsTools.Core/QMake.cs
+++ b/QtVsTools.Core/QMake.cs
@@ -31,6 +31,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;
+using Microsoft.VisualStudio.Shell;
using QtVsTools.VisualStudio;
namespace QtVsTools.Core
@@ -141,6 +142,9 @@ namespace QtVsTools.Core
{
StartInfo = qmakeStartInfo,
};
+
+ ThreadHelper.ThrowIfNotOnUIThread();
+
qmakeProc.OutputDataReceived += (sender, ev) => OutMsg(ev.Data);
qmakeProc.ErrorDataReceived += (sender, ev) => ErrMsg(ev.Data);
@@ -149,30 +153,37 @@ namespace QtVsTools.Core
protected virtual void OutMsg(string msg)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
if (Dte != null && !string.IsNullOrEmpty(msg))
Messages.Print(msg);
}
protected virtual void ErrMsg(string msg)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
if (Dte != null && !string.IsNullOrEmpty(msg))
Messages.Print(msg);
}
protected virtual void InfoMsg(string msg)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
if (Dte != null && !string.IsNullOrEmpty(msg))
Messages.Print(msg);
}
protected virtual void InfoStart(Process qmakeProc)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
InfoMsg(string.Format("--- qmake({0}): started {1}",
qmakeProc.Id, qmakeProc.StartInfo.FileName));
}
protected virtual void InfoExit(Process qmakeProc)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
InfoMsg(string.Format("--- qmake({0}): exit code {1} ({2:0.##} msecs)\r\n",
qmakeProc.Id, qmakeProc.ExitCode,
(qmakeProc.ExitTime - qmakeProc.StartTime).TotalMilliseconds));
@@ -180,6 +191,8 @@ namespace QtVsTools.Core
public virtual int Run(bool setVCVars = false)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
int exitCode = -1;
using (var qmakeProc = CreateProcess()) {
try {
@@ -231,6 +244,8 @@ namespace QtVsTools.Core
protected override void InfoStart(Process qmakeProc)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
base.InfoStart(qmakeProc);
InfoMsg("--- qmake: Working Directory: " + qmakeProc.StartInfo.WorkingDirectory);
InfoMsg("--- qmake: Arguments: " + qmakeProc.StartInfo.Arguments);
diff --git a/QtVsTools.Core/QMakeConf.cs b/QtVsTools.Core/QMakeConf.cs
index 2701772c..7ac6ccb6 100644
--- a/QtVsTools.Core/QMakeConf.cs
+++ b/QtVsTools.Core/QMakeConf.cs
@@ -26,6 +26,7 @@
**
****************************************************************************/
+using Microsoft.VisualStudio.Shell;
using System;
using System.Collections;
using System.IO;
@@ -39,6 +40,8 @@ namespace QtVsTools.Core
public QMakeConf(VersionInformation versionInfo, QMakeQuery qmakeQuery = null)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
Entries = new Hashtable();
QMakeSpecDirectory = Path.Combine(versionInfo.qtDir, "mkspecs", "default");
var qmakeConf = Path.Combine(QMakeSpecDirectory, "qmake.conf");
diff --git a/QtVsTools.Core/QMakeQuery.cs b/QtVsTools.Core/QMakeQuery.cs
index d9007891..9e79bbea 100644
--- a/QtVsTools.Core/QMakeQuery.cs
+++ b/QtVsTools.Core/QMakeQuery.cs
@@ -30,6 +30,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
+using Microsoft.VisualStudio.Shell;
using QtVsTools.SyntaxAnalysis;
namespace QtVsTools.Core
@@ -49,6 +50,8 @@ namespace QtVsTools.Core
protected override void InfoStart(Process qmakeProc)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
base.InfoStart(qmakeProc);
InfoMsg("--- qmake: Querying persistent properties");
}
@@ -58,6 +61,8 @@ namespace QtVsTools.Core
stdOutput = new StringBuilder();
Query = " ";
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (Run() == 0 && stdOutput.Length > 0) {
return PropertyParser
.Parse(stdOutput.ToString())
@@ -74,6 +79,8 @@ namespace QtVsTools.Core
{
get
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
string value = string.Empty;
if (Properties.TryGetValue(name, out value))
return value;
@@ -83,7 +90,14 @@ namespace QtVsTools.Core
}
Dictionary<string, string> _Properties;
- Dictionary<string, string> Properties => _Properties ?? (_Properties = QueryAllValues());
+ Dictionary<string, string> Properties
+ {
+ get
+ {
+ ThreadHelper.ThrowIfNotOnUIThread();
+ return _Properties ?? (_Properties = QueryAllValues());
+ }
+ }
Parser _PropertyParser;
Parser PropertyParser
diff --git a/QtVsTools.Core/QtModules.cs b/QtVsTools.Core/QtModules.cs
index 19bd9268..52e2fbe4 100644
--- a/QtVsTools.Core/QtModules.cs
+++ b/QtVsTools.Core/QtModules.cs
@@ -83,6 +83,8 @@ namespace QtVsTools.Core
if (xml == null)
return;
+ Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread();
+
foreach (var xModule in xml.Elements("QtVsTools").Elements("Module")) {
int id = (int)xModule.Attribute("Id");
QtModule module = new QtModule(id);
diff --git a/QtVsTools.Core/QtProject.cs b/QtVsTools.Core/QtProject.cs
index 5223bef7..4c651fc5 100644
--- a/QtVsTools.Core/QtProject.cs
+++ b/QtVsTools.Core/QtProject.cs
@@ -37,6 +37,7 @@ using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Xml;
using QtVsTools.Core.QtMsBuild;
+using Microsoft.VisualStudio.Shell;
namespace QtVsTools.Core
{
@@ -59,6 +60,7 @@ namespace QtVsTools.Core
public static QtProject Create(VCProject vcProject)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
return Create((Project)vcProject.Object);
}
@@ -79,6 +81,8 @@ namespace QtVsTools.Core
private QtProject(Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (project == null)
throw new QtVSException(SR.GetString("QtProject_CannotConstructWithoutValidProject"));
envPro = project;
@@ -131,6 +135,8 @@ namespace QtVsTools.Core
public static bool IsQtMsBuildEnabled(Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (project == null)
return false;
return IsQtMsBuildEnabled(project.Object as VCProject);
@@ -139,6 +145,8 @@ namespace QtVsTools.Core
private bool? isQtMsBuildEnabled = null;
public bool IsQtMsBuildEnabled()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (!isQtMsBuildEnabled.HasValue) {
if (vcPro != null)
isQtMsBuildEnabled = IsQtMsBuildEnabled(vcPro);
@@ -166,6 +174,8 @@ namespace QtVsTools.Core
{
get
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var ret = false;
if (lastConfigurationRowNames == null) {
lastConfigurationRowNames = envPro.ConfigurationManager.ConfigurationRowNames as Array;
@@ -187,6 +197,8 @@ namespace QtVsTools.Core
/// <param name="uiFile">name of the ui file</param>
public string GetUiGeneratedFileName(string uiFile)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var fi = new FileInfo(uiFile);
var file = fi.Name;
if (HelperFunctions.IsUicFile(file)) {
@@ -225,6 +237,8 @@ namespace QtVsTools.Core
private string GetRelativeMocFilePath(string file, string configName = null,
string platformName = null)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var fileName = GetMocFileName(file);
if (fileName == null)
return null;
@@ -252,17 +266,25 @@ namespace QtVsTools.Core
public static int GetFormatVersion(Project pro)
{
- if (pro == null)
- return 0;
- return GetFormatVersion(pro.Object as VCProject);
+ ThreadHelper.ThrowIfNotOnUIThread();
+ return pro == null ? 0 : GetFormatVersion(pro.Object as VCProject);
}
- public int FormatVersion { get { return GetFormatVersion(Project); } }
+ public int FormatVersion
+ {
+ get
+ {
+ ThreadHelper.ThrowIfNotOnUIThread();
+ return GetFormatVersion(Project);
+ }
+ }
public static string GetPropertyValue(
EnvDTE.Project dteProject,
string propName)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var activeConfig = dteProject.ConfigurationManager?.ActiveConfiguration;
if (activeConfig == null)
return null;
@@ -275,6 +297,8 @@ namespace QtVsTools.Core
EnvDTE.Configuration dteConfig,
string propName)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (dteProject == null || dteConfig == null)
return null;
return GetPropertyValue(
@@ -310,6 +334,8 @@ namespace QtVsTools.Core
public void AddModule(int id)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (HasModule(id))
return;
@@ -375,6 +401,8 @@ namespace QtVsTools.Core
public void RemoveModule(int id)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
foreach (VCConfiguration config in (IVCCollection)vcPro.Configurations) {
var compiler = CompilerToolWrapper.Create(config);
var linker = (VCLinkerTool)((IVCCollection)config.Tools).Item("VCLinkerTool");
@@ -413,6 +441,8 @@ namespace QtVsTools.Core
public void UpdateModules(VersionInformation oldVersion, VersionInformation newVersion)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
foreach (VCConfiguration config in (IVCCollection)vcPro.Configurations) {
var linker = (VCLinkerTool)((IVCCollection)config.Tools).Item("VCLinkerTool");
@@ -462,6 +492,8 @@ namespace QtVsTools.Core
public bool HasModule(int id)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var foundInIncludes = false;
var foundInLibs = false;
@@ -514,6 +546,8 @@ namespace QtVsTools.Core
public void MarkAsDesignerPluginProject()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
Project.Globals["IsDesignerPlugin"] = true.ToString();
if (!Project.Globals.get_VariablePersists("IsDesignerPlugin"))
Project.Globals.set_VariablePersists("IsDesignerPlugin", true);
@@ -558,6 +592,8 @@ namespace QtVsTools.Core
return;
}
+ ThreadHelper.ThrowIfNotOnUIThread();
+
CustomTool toolSettings =
IsQtMsBuildEnabled() ? CustomTool.MSBuildTarget : CustomTool.CustomBuildStep;
@@ -751,6 +787,8 @@ namespace QtVsTools.Core
private string GetPCHMocOptions(VCFile file, CompilerToolWrapper compiler)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
// As .moc files are included, we should not add anything there
if (!HelperFunctions.IsHeaderFile(file.Name))
return string.Empty;
@@ -777,6 +815,8 @@ namespace QtVsTools.Core
VCFileConfiguration workFileConfig,
VCFile mocFile)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var hasDifferentMocFilePerConfig =
QtVSIPSettings.HasDifferentMocFilePerConfig(envPro);
var hasDifferentMocFilePerPlatform =
@@ -903,6 +943,9 @@ namespace QtVsTools.Core
+ mocFileName + "))";
var regExp = new Regex(pattern);
var matchList = regExp.Matches(tool.Outputs.Replace(ProjectMacros.Name, baseFileName));
+
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (matchList.Count > 0) {
if (matchList[0].Length > 0)
outputMocFile = matchList[0].ToString();
@@ -1037,6 +1080,8 @@ namespace QtVsTools.Core
string includes,
string description)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var baseFileName = sourceFile.Name.Remove(sourceFile.Name.LastIndexOf('.'));
var outputMocFile = GetRelativeMocFilePath(sourceFile.FullPath);
var outputMocPath = Path.GetDirectoryName(outputMocFile);
@@ -1074,6 +1119,8 @@ namespace QtVsTools.Core
var platform = vcConfig.Platform as VCPlatform;
var platformName = platform.Name;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var mocRelPath = GetRelativeMocFilePath(
sourceFile.FullPath,
vcConfig.ConfigurationName,
@@ -1164,6 +1211,7 @@ namespace QtVsTools.Core
CustomTool toolSettings =
IsQtMsBuildEnabled() ? CustomTool.MSBuildTarget : CustomTool.CustomBuildStep;
+ ThreadHelper.ThrowIfNotOnUIThread();
try {
var mocFileName = GetMocFileName(file.FullPath);
if (mocFileName == null)
@@ -1257,6 +1305,8 @@ namespace QtVsTools.Core
if (HelperFunctions.IsHeaderFile(file.Name))
return CheckForCommand(file, "moc.exe");
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (HelperFunctions.IsSourceFile(file.Name)) {
return (HasCppMocFiles(file));
}
@@ -1286,6 +1336,8 @@ namespace QtVsTools.Core
public void RefreshRccSteps()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
Messages.Print("\r\n=== Update rcc steps ===");
var files = GetResourceFiles();
@@ -1316,6 +1368,8 @@ namespace QtVsTools.Core
public void RefreshRccSteps(string oldRccDir)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
RefreshRccSteps();
UpdateCompilerIncludePaths(oldRccDir, QtVSIPSettings.GetRccDirectory(envPro));
}
@@ -1348,16 +1402,15 @@ namespace QtVsTools.Core
var cmdLine = string.Empty;
var cbt = HelperFunctions.GetCustomBuildTool(vfc);
-
cbt.AdditionalDependencies = filesInQrcFile;
-
cbt.Description = "Rcc'ing " + ProjectMacros.FileName + "...";
-
cbt.Outputs = qrcCppFile.Replace(nameOnly, ProjectMacros.Name);
cmdLine += "\"" + Resources.rcc4Command + "\""
+ " -name \"" + ProjectMacros.Name + "\"";
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (rccOptsCfg == null)
rccOptsCfg = HelperFunctions.ParseRccOptions(cbt.CommandLine, qrcFile);
@@ -1378,6 +1431,8 @@ namespace QtVsTools.Core
return;
}
+ ThreadHelper.ThrowIfNotOnUIThread();
+
CustomTool toolSettings =
IsQtMsBuildEnabled() ? CustomTool.MSBuildTarget : CustomTool.CustomBuildStep;
@@ -1529,27 +1584,30 @@ namespace QtVsTools.Core
bool HasCppMocFiles(VCFile cppFile)
{
- if (!IsQtMsBuildEnabled()) {
+ ThreadHelper.ThrowIfNotOnUIThread();
+
+ if (!IsQtMsBuildEnabled())
return File.Exists(Path.ChangeExtension(cppFile.FullPath, ".cbt"));
- } else {
- var vcProj = cppFile.project as VCProject;
- if (vcProj != null) {
- foreach (VCFile vcFile in (IVCCollection)vcProj.Files) {
- if (vcFile.ItemType == "CustomBuild") {
- if (IsCppMocFileCustomBuild(vcProj, vcFile, cppFile))
- return true;
- } else if (vcFile.ItemType == QtMoc.ItemTypeName) {
- if (IsCppMocFileQtMsBuild(vcProj, vcFile, cppFile))
- return true;
- }
+
+ var vcProj = cppFile.project as VCProject;
+ if (vcProj != null) {
+ foreach (VCFile vcFile in (IVCCollection)vcProj.Files) {
+ if (vcFile.ItemType == "CustomBuild") {
+ if (IsCppMocFileCustomBuild(vcProj, vcFile, cppFile))
+ return true;
+ } else if (vcFile.ItemType == QtMoc.ItemTypeName) {
+ if (IsCppMocFileQtMsBuild(vcProj, vcFile, cppFile))
+ return true;
}
}
- return false;
}
+ return false;
}
public void RemoveMocStep(VCFile file)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (file.ItemType == QtMoc.ItemTypeName) {
RemoveMocStepQtMsBuild(file);
} else if (HelperFunctions.IsHeaderFile(file.Name)) {
@@ -1588,6 +1646,7 @@ namespace QtVsTools.Core
/// <param name="file">file</param>
public void RemoveMocStepCustomBuild(VCFile file)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
try {
if (!HasMocStep(file))
return;
@@ -1971,6 +2030,8 @@ namespace QtVsTools.Core
public bool IsDesignerPluginProject()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var b = false;
if (Project.Globals.get_VariablePersists("IsDesignerPlugin")) {
var s = (string)Project.Globals["IsDesignerPlugin"];
@@ -1997,7 +2058,7 @@ namespace QtVsTools.Core
}
try {
- Microsoft.VisualStudio.Shell.ThreadHelper.ThrowIfNotOnUIThread();
+ ThreadHelper.ThrowIfNotOnUIThread();
var prop = dte.get_Properties("TextEditor", "C/C++");
var tabSize = Convert.ToInt64(prop.Item("TabSize").Value);
var insertTabs = Convert.ToBoolean(prop.Item("InsertTabs").Value);
@@ -2056,6 +2117,8 @@ namespace QtVsTools.Core
public void AddActiveQtBuildStep(string version, string defFile = null)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (FormatVersion < Resources.qtMinFormatVersion_ClProperties)
return;
@@ -2086,6 +2149,8 @@ namespace QtVsTools.Core
private void UpdateCompilerIncludePaths(string oldDir, string newDir)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var fixedOldDir = FixFilePathForComparison(oldDir);
var dirs = new[] {
FixFilePathForComparison(QtVSIPSettings.GetUicDirectory(envPro)),
@@ -2139,6 +2204,8 @@ namespace QtVsTools.Core
public void UpdateUicSteps(string oldUicDir, bool update_inc_path)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
Messages.Print("\r\n=== Update uic steps ===");
var vcFilter = FindFilterFromGuid(Filters.GeneratedFiles().UniqueIdentifier);
if (vcFilter != null) {
@@ -2253,6 +2320,8 @@ namespace QtVsTools.Core
/// <returns></returns>
private VCFile GetGeneratedMocFile(string fileName, VCFileConfiguration fileConfig)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (QtVSIPSettings.HasDifferentMocFilePerConfig(envPro)
|| QtVSIPSettings.HasDifferentMocFilePerPlatform(envPro)) {
var projectConfig = (VCConfiguration)fileConfig.ProjectConfiguration;
@@ -2332,6 +2401,8 @@ namespace QtVsTools.Core
if (filesCollection == null)
return;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
int progress = 0;
int progressTotal = filesCollection.Count;
var waitDialog = WaitDialog.StartWithProgress(SR.GetString("Resources_QtVsTools"),
@@ -2351,6 +2422,7 @@ namespace QtVsTools.Core
public void RefreshMocStep(VCFile vcfile)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
RefreshMocStep(vcfile, true);
}
@@ -2371,6 +2443,8 @@ namespace QtVsTools.Core
if (mocCmdChecker == null)
mocCmdChecker = new MocCmdChecker();
+ ThreadHelper.ThrowIfNotOnUIThread();
+
foreach (VCFileConfiguration config in (IVCCollection)vcfile.FileConfigurations) {
try {
string commandLine = "";
@@ -2503,6 +2577,8 @@ namespace QtVsTools.Core
public void OnExcludedFromBuildChanged(VCFile vcFile, VCFileConfiguration vcFileCfg)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
// Update the ExcludedFromBuild flags of the mocced file
// according to the ExcludedFromBuild flag of the mocable source file.
var moccedFileName = GetMocFileName(vcFile.Name);
@@ -2572,6 +2648,8 @@ namespace QtVsTools.Core
public void UpdateMocSteps(string oldMocDir)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
Messages.Print("\r\n=== Update moc steps ===");
var orgFiles = new List<VCFile>();
var abandonedMocFiles = new List<string>();
@@ -2634,6 +2712,8 @@ namespace QtVsTools.Core
private void Clean()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var solutionConfigs = envPro.DTE.Solution.SolutionBuild.SolutionConfigurations;
var backup = new List<KeyValuePair<SolutionContext, bool>>();
foreach (SolutionConfiguration config in solutionConfigs) {
@@ -2688,6 +2768,8 @@ namespace QtVsTools.Core
public bool isWinRT()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
try {
var vcProject = Project.Object as VCProject;
var vcConfigs = vcProject.Configurations as IVCCollection;
@@ -2714,6 +2796,8 @@ namespace QtVsTools.Core
if (newIsWinRt == oldIsWinRt || newIsWinRt == isWinRT())
return true;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var promptCaption = string.Format("Change Qt Version ({0})", Project.Name);
var promptText = string.Format(
"Changing Qt version from {0} to {1}.\r\n" +
@@ -2753,6 +2837,8 @@ namespace QtVsTools.Core
var refreshMocSteps = (vsPlatformNameNew != vsPlatformNameOld);
var platformChanged = (vsPlatformNameNew != vsPlatformNameOld);
+ ThreadHelper.ThrowIfNotOnUIThread();
+
try {
if (platformChanged) {
if (!SelectSolutionPlatform(vsPlatformNameNew) || !HasPlatform(vsPlatformNameNew)) {
@@ -2804,6 +2890,8 @@ namespace QtVsTools.Core
public bool SelectSolutionPlatform(string platformName)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
foreach (SolutionConfiguration solutionCfg in dte.Solution.SolutionBuild.SolutionConfigurations) {
var contexts = solutionCfg.SolutionContexts;
for (var i = 1; i <= contexts.Count; ++i) {
@@ -2829,6 +2917,8 @@ namespace QtVsTools.Core
public void CreatePlatform(string oldPlatform, string newPlatform,
VersionInformation viOld, VersionInformation viNew, ref bool newProjectCreated)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
try {
var cfgMgr = envPro.ConfigurationManager;
cfgMgr.AddPlatform(newPlatform, oldPlatform, true);
@@ -2890,9 +2980,9 @@ namespace QtVsTools.Core
if (genVCFilter == null)
return;
- var error = false;
- error = DeleteFilesFromFilter(genVCFilter);
- if (error)
+ ThreadHelper.ThrowIfNotOnUIThread();
+
+ if (DeleteFilesFromFilter(genVCFilter))
Messages.Print(SR.GetString("DeleteGeneratedFilesError"));
}
@@ -3037,6 +3127,8 @@ namespace QtVsTools.Core
public void CollapseFilter(string filterName)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var solutionExplorer = (UIHierarchy)dte.Windows.Item(Constants.vsext_wk_SProjectWindow).Object;
if (solutionExplorer.UIHierarchyItems.Count == 0)
return;
@@ -3050,6 +3142,8 @@ namespace QtVsTools.Core
private UIHierarchyItem FindProjectHierarchyItem(UIHierarchy hierarchy)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (hierarchy.UIHierarchyItems.Count == 0)
return null;
@@ -3065,6 +3159,8 @@ namespace QtVsTools.Core
private UIHierarchyItem FindProjectHierarchyItem(UIHierarchyItem root)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
UIHierarchyItem projectItem = null;
try {
if (root.Name == envPro.Name)
@@ -3085,6 +3181,7 @@ namespace QtVsTools.Core
/// </summary>
public string GetQtVersion()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
return QtVersionManager.The().GetProjectQtVersion(envPro);
}
@@ -3093,6 +3190,7 @@ namespace QtVsTools.Core
/// </summary>
public void SetQtEnvironment()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
SetQtEnvironment(QtVersionManager.The().GetProjectQtVersion(envPro));
}
@@ -3101,6 +3199,7 @@ namespace QtVsTools.Core
/// </summary>
public void SetQtEnvironment(string qtVersion)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
SetQtEnvironment(qtVersion, string.Empty);
}
@@ -3119,6 +3218,8 @@ namespace QtVsTools.Core
if (qtVersion != "$(QTDIR)")
qtDir = QtVersionManager.The().GetInstallPath(qtVersion);
HelperFunctions.SetEnvironmentVariableEx("QTDIR", qtDir);
+
+ ThreadHelper.ThrowIfNotOnUIThread();
try {
var propertyAccess = (IVCBuildPropertyStorage)vcPro;
var vcprj = envPro.Object as VCProject;
diff --git a/QtVsTools.Core/QtVSIPSettings.cs b/QtVsTools.Core/QtVSIPSettings.cs
index 58c7b2ad..374cfb0f 100644
--- a/QtVsTools.Core/QtVSIPSettings.cs
+++ b/QtVsTools.Core/QtVSIPSettings.cs
@@ -26,6 +26,7 @@
**
****************************************************************************/
+using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.VCProjectEngine;
using Microsoft.Win32;
using System;
@@ -56,11 +57,14 @@ namespace QtVsTools.Core
public static string GetUicDirectory(EnvDTE.Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
return GetDirectory(project, Resources.uicDirKeyword);
}
public static void SaveUicDirectory(EnvDTE.Project project, string directory)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (directory == null)
SaveDirectory(project, Resources.uicDirKeyword, GetDirectory(project, Resources.uicDirKeyword));
else
@@ -74,6 +78,7 @@ namespace QtVsTools.Core
public static string GetMocDirectory(EnvDTE.Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
return GetDirectory(project, Resources.mocDirKeyword);
}
@@ -82,6 +87,8 @@ namespace QtVsTools.Core
string configName,
string platformName, VCFile vCFile)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
string filePath = null;
if (vCFile != null)
filePath = vCFile.FullPath;
@@ -94,6 +101,8 @@ namespace QtVsTools.Core
string platformName,
string filePath = null)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var dir = GetDirectory(project, Resources.mocDirKeyword);
if (!string.IsNullOrEmpty(configName)
&& !string.IsNullOrEmpty(platformName))
@@ -103,12 +112,16 @@ namespace QtVsTools.Core
public static bool HasDifferentMocFilePerConfig(EnvDTE.Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var mocDir = GetMocDirectory(project);
return mocDir.Contains("$(ConfigurationName)");
}
public static bool HasDifferentMocFilePerPlatform(EnvDTE.Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var mocDir = GetMocDirectory(project);
return mocDir.Contains("$(PlatformName)");
}
@@ -120,11 +133,14 @@ namespace QtVsTools.Core
public static string GetMocOptions(EnvDTE.Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
return GetOption(project, Resources.mocOptionsKeyword);
}
public static bool GetLUpdateOnBuild(EnvDTE.Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (GetProjectQtSetting(project, "QtRunLUpdateOnBuild") == "true")
return true;
return GetBoolValue(project, Resources.lupdateKeyword);
@@ -137,6 +153,8 @@ namespace QtVsTools.Core
static string GetProjectQtSetting(EnvDTE.Project project, string propertyName)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var vcProject = project.Object as VCProject;
if (vcProject == null)
return null;
@@ -165,6 +183,8 @@ namespace QtVsTools.Core
public static string GetLUpdateOptions(EnvDTE.Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
string qtLUpdateOptions = GetProjectQtSetting(project, "QtLUpdateOptions");
if (!string.IsNullOrEmpty(qtLUpdateOptions))
return qtLUpdateOptions;
@@ -178,6 +198,8 @@ namespace QtVsTools.Core
public static string GetLReleaseOptions(EnvDTE.Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
string qtLReleaseOptions = GetProjectQtSetting(project, "QtLReleaseOptions");
if (!string.IsNullOrEmpty(qtLReleaseOptions))
return qtLReleaseOptions;
@@ -186,6 +208,8 @@ namespace QtVsTools.Core
public static void SaveMocDirectory(EnvDTE.Project project, string directory)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (directory == null)
SaveDirectory(project, Resources.mocDirKeyword, GetDirectory(project, Resources.mocDirKeyword));
else
@@ -196,11 +220,15 @@ namespace QtVsTools.Core
{
if (options == null)
options = GetMocOptions();
+
+ ThreadHelper.ThrowIfNotOnUIThread();
+
SaveOption(project, Resources.mocOptionsKeyword, options);
}
public static void SaveLUpdateOnBuild(EnvDTE.Project project, bool value)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
SetBoolValue(project, Resources.lupdateKeyword, value);
}
@@ -209,6 +237,8 @@ namespace QtVsTools.Core
if (options == null)
options = GetLUpdateOptions();
+ ThreadHelper.ThrowIfNotOnUIThread();
+
SaveOption(project, Resources.lupdateOptionsKeyword, options);
}
@@ -216,16 +246,22 @@ namespace QtVsTools.Core
{
if (options == null)
options = GetLReleaseOptions();
+
+ ThreadHelper.ThrowIfNotOnUIThread();
+
SaveOption(project, Resources.lreleaseOptionsKeyword, options);
}
public static string GetRccDirectory(EnvDTE.Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
return GetDirectory(project, Resources.rccDirKeyword);
}
public static void SaveRccDirectory(EnvDTE.Project project, string directory)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (directory == null)
SaveDirectory(project, Resources.rccDirKeyword, GetDirectory(project, Resources.rccDirKeyword));
else
@@ -272,6 +308,8 @@ namespace QtVsTools.Core
private static string GetDirectory(EnvDTE.Project project, string type)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
// check for directory in following order:
// - stored in project
// - stored in cache
@@ -355,6 +393,8 @@ namespace QtVsTools.Core
private static string GetOption(EnvDTE.Project project, string type)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
// check for directory in following order:
// - stored in project
// - globally defined default option
@@ -366,6 +406,8 @@ namespace QtVsTools.Core
private static bool GetBoolValue(EnvDTE.Project project, string type)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
// check for directory in following order:
// - stored in project
// - globally defined default option
@@ -377,6 +419,8 @@ namespace QtVsTools.Core
private static void SaveDirectory(EnvDTE.Project project, string type, string dir)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
dir = HelperFunctions.NormalizeRelativeFilePath(dir);
project.Globals[type] = dir;
if (!project.Globals.get_VariablePersists(type))
@@ -387,6 +431,8 @@ namespace QtVsTools.Core
private static void SaveOption(EnvDTE.Project project, string type, string option)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
project.Globals[type] = option;
if (!project.Globals.get_VariablePersists(type))
project.Globals.set_VariablePersists(type, true);
@@ -394,6 +440,8 @@ namespace QtVsTools.Core
private static void SetBoolValue(EnvDTE.Project project, string type, bool value)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
project.Globals[type] = Convert.ToInt32(value).ToString();
if (!project.Globals.get_VariablePersists(type))
project.Globals.set_VariablePersists(type, true);
@@ -401,6 +449,8 @@ namespace QtVsTools.Core
public static void cleanUpCache(EnvDTE.Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
try {
var mocEnumerator = mocDirCache.GetEnumerator();
while (mocEnumerator.MoveNext()) {
diff --git a/QtVsTools.Core/QtVersionManager.cs b/QtVsTools.Core/QtVersionManager.cs
index c52b0661..9353efab 100644
--- a/QtVsTools.Core/QtVersionManager.cs
+++ b/QtVsTools.Core/QtVersionManager.cs
@@ -26,6 +26,7 @@
**
****************************************************************************/
+using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.VCProjectEngine;
using Microsoft.Win32;
using System;
@@ -48,6 +49,8 @@ namespace QtVsTools.Core
protected QtVersionManager()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
strVersionKey = "Versions";
regVersionPath = Resources.registryVersionPath;
RefreshVersionNames();
@@ -63,8 +66,8 @@ namespace QtVsTools.Core
}
} catch (Exception e) {
- Messages.Print(
- e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace);
+ ThreadHelper.ThrowIfNotOnUIThread();
+ Messages.Print(e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace);
}
}
@@ -89,6 +92,8 @@ namespace QtVsTools.Core
public VersionInformation GetVersionInfo(string name)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (name == "$(DefaultQtVersion)")
name = GetDefaultVersion();
if (name == null)
@@ -108,6 +113,7 @@ namespace QtVsTools.Core
public VersionInformation GetVersionInfo(EnvDTE.Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
return GetVersionInfo(GetProjectQtVersion(project));
}
@@ -118,6 +124,8 @@ namespace QtVsTools.Core
public string GetQtVersionFromInstallDir(string qtDir)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (qtDir == null)
return null;
@@ -153,6 +161,8 @@ namespace QtVsTools.Core
/// <returns>true, if we found an invalid version</returns>
public bool HasInvalidVersions(out string errorMessage)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var validVersions = new Dictionary<string, QtConfig>();
var invalidVersions = new List<string>();
@@ -230,6 +240,8 @@ namespace QtVsTools.Core
public string GetInstallPath(string version)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (version == "$(DefaultQtVersion)")
version = GetDefaultVersion();
return GetInstallPath(version, Registry.CurrentUser);
@@ -237,6 +249,8 @@ namespace QtVsTools.Core
public string GetInstallPath(string version, RegistryKey root)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (version == "$(DefaultQtVersion)")
version = GetDefaultVersion(root);
if (version == "$(QTDIR)")
@@ -253,6 +267,8 @@ namespace QtVsTools.Core
public string GetInstallPath(EnvDTE.Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var version = GetProjectQtVersion(project);
if (version == "$(DefaultQtVersion)")
version = GetDefaultVersion();
@@ -283,6 +299,8 @@ namespace QtVsTools.Core
}
}
+ ThreadHelper.ThrowIfNotOnUIThread();
+
string rootKeyPath = "SOFTWARE\\" + Resources.registryRootPath;
string versionKeyPath = strVersionKey + "\\" + verName;
using (var key = Registry.CurrentUser.CreateSubKey(rootKeyPath)) {
@@ -311,6 +329,9 @@ namespace QtVsTools.Core
return;
key.DeleteSubKey(versionName);
key.Close();
+
+ ThreadHelper.ThrowIfNotOnUIThread();
+
RefreshVersionNames();
}
@@ -329,6 +350,7 @@ namespace QtVsTools.Core
public bool SaveProjectQtVersion(EnvDTE.Project project, string version)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
return SaveProjectQtVersion(project, version, project.ConfigurationManager.ActiveConfiguration.PlatformName);
}
@@ -336,6 +358,9 @@ namespace QtVsTools.Core
{
if (!IsVersionAvailable(version) && version != "$(DefaultQtVersion)")
return false;
+
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (QtProject.GetFormatVersion(project) >= Resources.qtMinFormatVersion_Settings) {
var vcPro = project.Object as VCProject;
if (vcPro == null)
@@ -346,6 +371,9 @@ namespace QtVsTools.Core
}
return true;
}
+
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var key = "Qt5Version " + platform;
if (!project.Globals.get_VariableExists(key) || project.Globals[key].ToString() != version)
project.Globals[key] = version;
@@ -356,6 +384,8 @@ namespace QtVsTools.Core
public string GetProjectQtVersion(EnvDTE.Project project)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
EnvDTE.Configuration config = null;
try {
config = project.ConfigurationManager.ActiveConfiguration;
@@ -383,6 +413,8 @@ namespace QtVsTools.Core
if (QtProject.GetFormatVersion(project) >= Resources.qtMinFormatVersion_Settings)
return QtProject.GetPropertyValue(project, config, "QtInstall");
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var key = "Qt5Version " + config.PlatformName;
if (!project.Globals.get_VariablePersists(key))
return null;
@@ -396,6 +428,8 @@ namespace QtVsTools.Core
if (QtProject.GetFormatVersion(project) >= Resources.qtMinFormatVersion_Settings)
return GetProjectQtVersion(project);
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var key = "Qt5Version " + platform;
if (!project.Globals.get_VariablePersists(key))
return null;
@@ -423,6 +457,9 @@ namespace QtVsTools.Core
{
if (!IsVersionAvailable(version) && version != "$(DefaultQtVersion)")
return false;
+
+ ThreadHelper.ThrowIfNotOnUIThread();
+
solution.Globals["Qt5Version"] = version;
if (!solution.Globals.get_VariablePersists("Qt5Version"))
solution.Globals.set_VariablePersists("Qt5Version", true);
@@ -434,6 +471,8 @@ namespace QtVsTools.Core
if (solution == null)
return null;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (solution.Globals.get_VariableExists("Qt5Version")) {
var version = (string)solution.Globals["Qt5Version"];
return VerifyIfQtVersionExists(version) ? version : null;
@@ -444,6 +483,7 @@ namespace QtVsTools.Core
public string GetDefaultVersion()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
return GetDefaultVersion(Registry.CurrentUser);
}
@@ -458,6 +498,8 @@ namespace QtVsTools.Core
Messages.DisplayWarningMessage(SR.GetString("QtVersionManager_CannotLoadQtVersion"));
}
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (defaultVersion == null) {
MergeVersions();
var key = root.OpenSubKey("SOFTWARE\\" + regVersionPath, false);
@@ -498,6 +540,8 @@ namespace QtVsTools.Core
var hkcuVersions = GetVersions();
var hklmVersions = GetVersions(Registry.LocalMachine);
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var hkcuInstDirs = new string[hkcuVersions.Length];
for (var i = 0; i < hkcuVersions.Length; ++i)
hkcuInstDirs[i] = GetInstallPath(hkcuVersions[i]);
@@ -533,6 +577,8 @@ namespace QtVsTools.Core
private bool VerifyIfQtVersionExists(string version)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (version == "$(DefaultQtVersion)")
version = GetDefaultVersion();
if (!string.IsNullOrEmpty(version)) {
diff --git a/QtVsTools.Core/RccOptions.cs b/QtVsTools.Core/RccOptions.cs
index 6d4696af..71c0c761 100644
--- a/QtVsTools.Core/RccOptions.cs
+++ b/QtVsTools.Core/RccOptions.cs
@@ -26,6 +26,7 @@
**
****************************************************************************/
+using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.VCProjectEngine;
using System;
@@ -57,6 +58,8 @@ namespace QtVsTools.Core
{
get
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (project.Globals.get_VariablePersists("RccCompressFiles" + id)
&& (string)project.Globals["RccCompressFiles" + id] == "true")
return true;
@@ -64,6 +67,8 @@ namespace QtVsTools.Core
}
set
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (value)
project.Globals["RccCompressFiles" + id] = "true";
else
@@ -77,12 +82,16 @@ namespace QtVsTools.Core
{
get
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (project.Globals.get_VariablePersists("RccCompressLevel" + id))
return Convert.ToInt32((string)project.Globals["RccCompressLevel" + id], 10);
return 0;
}
set
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
project.Globals["RccCompressLevel" + id] = value.ToString();
if (!project.Globals.get_VariablePersists("RccCompressLevel" + id))
project.Globals.set_VariablePersists("RccCompressLevel" + id, true);
@@ -93,12 +102,16 @@ namespace QtVsTools.Core
{
get
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (project.Globals.get_VariablePersists("RccCompressThreshold" + id))
return Convert.ToInt32((string)project.Globals["RccCompressThreshold" + id], 10);
return 0;
}
set
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
project.Globals["RccCompressThreshold" + id] = value.ToString();
if (!project.Globals.get_VariablePersists("RccCompressThreshold" + id))
project.Globals.set_VariablePersists("RccCompressThreshold" + id, true);
diff --git a/QtVsTools.Core/VersionInformation.cs b/QtVsTools.Core/VersionInformation.cs
index a5287f8e..45129efd 100644
--- a/QtVsTools.Core/VersionInformation.cs
+++ b/QtVsTools.Core/VersionInformation.cs
@@ -26,6 +26,7 @@
**
****************************************************************************/
+using Microsoft.VisualStudio.Shell;
using System;
using System.Collections;
using System.Collections.Generic;
@@ -95,6 +96,7 @@ namespace QtVsTools.Core
{
qtDir = qtDirIn;
+ ThreadHelper.ThrowIfNotOnUIThread();
try {
var qmakeQuery = new QMakeQuery(this);
SetupPlatformSpecificData(qmakeQuery);
@@ -287,6 +289,8 @@ namespace QtVsTools.Core
{
var qmakeQuery = new QMakeQuery(this);
string qmakeXSpec;
+
+ ThreadHelper.ThrowIfNotOnUIThread();
try {
qmakeXSpec = qmakeQuery["QMAKE_XSPEC"];
} catch {
diff --git a/QtVsTools.Core/WaitDialog.cs b/QtVsTools.Core/WaitDialog.cs
index a97a1642..0eef5bc5 100644
--- a/QtVsTools.Core/WaitDialog.cs
+++ b/QtVsTools.Core/WaitDialog.cs
@@ -28,6 +28,7 @@
using System;
using Microsoft.VisualStudio;
+using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using QtVsTools.VisualStudio;
@@ -53,6 +54,8 @@ namespace QtVsTools.Core
if (VsWaitDialog == null)
return false;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
bool canceled = false;
int res = VsWaitDialog.HasCanceled(out canceled);
if (res != VSConstants.S_OK)
@@ -77,6 +80,8 @@ namespace QtVsTools.Core
return null;
}
+ ThreadHelper.ThrowIfNotOnUIThread();
+
IVsThreadedWaitDialog2 vsWaitDialog = null;
factory.CreateInstance(out vsWaitDialog);
if (vsWaitDialog == null)
@@ -103,6 +108,8 @@ namespace QtVsTools.Core
if (dialog == null)
return null;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var res = dialog.VsWaitDialog.StartWaitDialog(caption, message, progressText,
null, statusBarText, delay, isCancelable, showMarqueeProgress);
@@ -127,6 +134,8 @@ namespace QtVsTools.Core
if (dialog == null)
return null;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var res = dialog.VsWaitDialog.StartWaitDialogWithPercentageProgress(
caption, message, progressText, null, statusBarText,
isCancelable, delay, totalSteps, currentStep);
@@ -148,6 +157,8 @@ namespace QtVsTools.Core
if (!Running)
return;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
bool canceled = false;
int res = VsWaitDialog.UpdateProgress(message, progressText,
statusBarText, currentStep, totalSteps, disableCancel, out canceled);
@@ -164,6 +175,8 @@ namespace QtVsTools.Core
if (!Running)
return;
+ ThreadHelper.ThrowIfNotOnUIThread();
+
Running = false;
int canceled = 0;
VsWaitDialog.EndWaitDialog(out canceled);
@@ -172,6 +185,7 @@ namespace QtVsTools.Core
void IDisposable.Dispose()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
Stop();
}
}