如何使用IVsSolution.CreateProject以编程方式重新加载现有的卸载的c#项目

时间:2015-04-17 13:16:51

标签: c# visual-studio-2012 envdte vsix

我想在我的工作室扩展中添加两个按钮,用于卸载/加载开放式解决方案的所有测试项目。 经过很多麻烦,卸载工作正常。现在我仍然遇到麻烦加载它们。

不知怎的,我无法弄清楚如何正确使用IVsSolution.CreateProject()而我找不到任何例子。这是我到目前为止,总是让我回到VS_E_PROJECTALREADYEXISTS:

internal sealed class ProjInfo
{
    public ProjInfo(Guid guid, string name, string uniqueName)
    {
        Guid = guid;
        Name = name;
        UniqueName = uniqueName;
    }

    public Guid Guid { get; private set; }
    public string Name { get; private set; }
    public string UniqueName { get; private set; }

}

//....

private static void LoadProject(ProjInfo project, IVsSolution solutionService)
{
    IVsHierarchy selectedHierarchy;
    string solPath;
    string solFileName;
    string opstName;
    solutionService.GetSolutionInfo(out solPath, out solFileName, out opstName);
    string projRef;
    solutionService.GetProjectOfGuid(project.Guid, out selectedHierarchy);
    solutionService.GetProjrefOfProject(selectedHierarchy, out projRef);
    Guid projectType;
    IntPtr proj;
    solutionService.GetProjectTypeGuid(0, project.UniqueName, out projectType);
    projectType = Guid.Empty;
    var iidProject = Guid.Empty; //project.Guid;
    int res = VSConstants.S_OK;

    if (ErrorHandler.Failed(res = solutionService.CreateProject(ref projectType, solPath + project.UniqueName, null, null, (uint)__VSCREATEPROJFLAGS.CPF_OPENFILE, ref iidProject, out proj)))
    {
        Debug.Fail(String.Format("IVsolution::CreateProject retuend 0x{0:X}.", res));
    }
}

我使用了更多创建标志(__VSCREATEPROJFLAGS.CPF_OVERWRITE,__ VSSCREATEPROJFLAGS.CPF_SILENT)的任意组合,并且没有将引用projectType和iidProject设置为Guid.Emtpy。什么都行不通,我总是得到结果VS_E_PROJECTALREADYEXISTS。

知道如何在上下文菜单中实现我以编程方式卸载/重新加载项目的功能吗?也许是完全不同的方法? 非常感谢

2 个答案:

答案 0 :(得分:3)

使用自动化模型(EnvDTE),您可以从包中获取EnvDTE.DTE服务,并假设在解决方案资源管理器中调用dte.ExecuteCommand(“Project.ReloadProject”);

或者,尝试IVsSolution4.ReloadProject

我创建了两篇文章/样本:

HOWTO Unload/Reload a project from a Visual Studio package

答案 1 :(得分:0)

我们也使用项目文件卸载并重新加载项目。使用以下代码。

            Project.Save("projectfileFullPath");
            Project.DTE.ExecuteCommand("Project.UnloadProject", "");
            System.Threading.Thread.Sleep(500);
            Project.DTE.ExecuteCommand("Project.ReloadProject", "");