diff --git a/GodotAddinVS/GodotAddinVS.csproj b/GodotAddinVS/GodotAddinVS.csproj index cb3223c..e6b1c32 100644 --- a/GodotAddinVS/GodotAddinVS.csproj +++ b/GodotAddinVS/GodotAddinVS.csproj @@ -71,8 +71,10 @@ + + diff --git a/GodotAddinVS/GodotSolutionEventsListener.cs b/GodotAddinVS/GodotSolutionEventsListener.cs index 0d0be66..1bd68d7 100644 --- a/GodotAddinVS/GodotSolutionEventsListener.cs +++ b/GodotAddinVS/GodotSolutionEventsListener.cs @@ -8,6 +8,7 @@ using GodotAddinVS.GodotMessaging; using GodotTools.IdeMessaging; using GodotTools.IdeMessaging.Requests; +using Microsoft.VisualStudio; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; @@ -85,7 +86,7 @@ public override int OnAfterOpenProject(IVsHierarchy hierarchy, int added) if (_registered) return 0; - _godotProjectDir = SolutionDir; + _godotProjectDir = EvalGodotProjectDir(hierarchy); DebuggerEvents = ServiceProvider.GetService().Events.DebuggerEvents; DebuggerEvents.OnEnterDesignMode += DebuggerEvents_OnEnterDesignMode; @@ -162,5 +163,38 @@ private void Close() DebuggerEvents = null; } } + + private string EvalGodotProjectDir(IVsHierarchy hierarchy) + { + try + { + ThreadHelper.ThrowIfNotOnUIThread(); + var dteProject = GetDTEProject(hierarchy); + if (dteProject == null) + { + return SolutionDir; + } + + var evalProj = new Microsoft.Build.Evaluation.Project(dteProject.FullName); + var evaluated = evalProj.GetPropertyValue("GodotProjectDir"); + return string.IsNullOrWhiteSpace(evaluated) ? SolutionDir : evaluated; + } + catch + { + return SolutionDir; + } + } + + private static EnvDTE.Project GetDTEProject(IVsHierarchy hierarchy) + { + ThreadHelper.ThrowIfNotOnUIThread(); + + var itemid = VSConstants.VSITEMID_ROOT; + + object objProj; + hierarchy.GetProperty(itemid, (int)__VSHPROPID.VSHPROPID_ExtObject, out objProj); + + return objProj as EnvDTE.Project; + } } }