7

EnvDTEを使用して、ソリューション内のすべてのプロジェクトを一覧表示しましたが、コードにバグが見つかりました。アンロードされたプロジェクトを取得できません。

アンロードされたプロジェクトをスキップする方法を見つけました:

if (string.Compare(EnvDTE.Constants.vsProjectKindUnmodeled, project.Kind, System.StringComparison.OrdinalIgnoreCase) == 0)
  continue;

このように、私のコードはクラッシュしません-しかし、それらはすでに存在しているので、コードを介して欠落しているプロジェクトをロードすることはできません。

アンロードされたプロジェクトをソリューションにロードするにはどうすればよいですか?

私が試してみました:

project.DTE.ExecuteCommand("Project.ReloadProject");

そしてエラーが発生しました:

System.Runtime.InteropServices.COMException(...):コマンド「Project.ReloadProject」は使用できません。

だから私はどういうわけか取得しようとしました

application.DTE.ExecuteCommand("Project.ReloadProject");

しかしその前に、NETで検索したすべての場所から、ソリューション内のプロジェクトを事前に選択する必要があります。そのためには、必要なproject.Nameもの(私が持っているもの)と必要がないパス(すべての例があります)が必要です。 foundは、ソリューションパスがプロジェクトパスと同じであると想定していますが、一般的な状況ではほとんどありません)。

4

1 に答える 1

5

Visual Studio SDKは、明らかにこれを行う方法です。

var dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE");
Microsoft.VisualStudio.Shell.Interop.IVsUIHierarchyWindow hierarchy;
ServiceProvider sp = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte);
IVsSolution sol = (IVsSolution)sp.GetService(typeof(SVsSolution));

foreach (ProjInfo info in GetProjectInfo(sol))
{
    info.Dump();

}
//from http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/60fdd7b4-2247-4c18-b1da-301390edabf3/
static IEnumerable<ProjInfo> GetProjectInfo(IVsSolution sol)
{
  Guid ignored = Guid.Empty;
  IEnumHierarchies hierEnum;
  if (ErrorHandler.Failed(sol.GetProjectEnum((int)__VSENUMPROJFLAGS.EPF_ALLPROJECTS, ref ignored, out hierEnum)))
  {
    yield break;
  }

  IVsHierarchy[] hier = new IVsHierarchy[1];
  uint fetched;
  while ((hierEnum.Next((uint)hier.Length, hier, out fetched) == VSConstants.S_OK) && (fetched == hier.Length))
  {
    int res = (int)VSConstants.S_OK;

    Guid projGuid;
    if (ErrorHandler.Failed(res = sol.GetGuidOfProject(hier[0], out projGuid)))
    {
        Debug.Fail(String.Format("IVsolution::GetGuidOfProject returned 0x{0:X}.", res));
        continue;
    }

    string uniqueName;
    if (ErrorHandler.Failed(res = sol.GetUniqueNameOfProject(hier[0], out uniqueName)))
    {
        Debug.Fail(String.Format("IVsolution::GetUniqueNameOfProject returned 0x{0:X}.", res));
        continue;
    }
    if( System.IO.Path.GetInvalidPathChars().Any (p =>uniqueName.Contains(p) ))
    {
        uniqueName.Dump("invalid filename found");
        yield return new ProjInfo(projGuid,uniqueName);
    } 
    else {
        yield return new ProjInfo(projGuid, Path.GetFileName(uniqueName).BeforeOrSelf("{"));
    }
  }
}

そのほとんどをhttp://social.msdn.microsoft.com/Forums/en-US/vsx/thread/60fdd7b4-2247-4c18-b1da-301390edabf3/から入手しました

于 2013-01-09T21:08:57.820 に答える