在VS可扩展性演练中,Guid应包含32位数字和4个破折号(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)

时间:2014-05-30 16:49:53

标签: c# visual-studio vsx

我正在使用 演练:第1部分 - 创建基本项目系统 ,与网站http://msdn.microsoft.com/en-us/library/cc512961.aspx托管包框架完全一致完全从http://mpfproj11.codeplex.com/下载的项目。我已经在Visual Studio 2013中测试了多个开发机器上的演练。我还使用各自的SDK在Visual Studio 2010和2012中对此进行了测试。在每个测试中都会出现同样的问题。

问题:我收到异常 - mscorlib.dll中发生了'System.FormatException'类型的异常但未在用户代码中处理附加信息:Guid应包含32位数字,包含4个破折号(xxxxxxxx-xxxx-xxxx- ProjectNode类方法中的xxxx-xxxxxxxxxxxx:

private void SetProjectGuidFromProjectFile()
        {
            string projectGuid = this.GetProjectProperty(ProjectFileConstants.ProjectGuid);
            if (String.IsNullOrEmpty(projectGuid))
            {
                this.projectIdGuid = Guid.NewGuid();
            }
            else
            {
                Guid guid = new Guid(projectGuid);
                if (guid != this.projectIdGuid)
                {
                    this.projectIdGuid = guid;
                }
            }
        }

Guid guid = new Guid(projectGuid);

projectGuid返回字符串“$ guid1 $”,该字符串来自SimpleProject.myproj中的<ProjectGuid>$guid1$</ProjectGuid>

ProjectNode类的Load方法中的断点显示

this.projectIdGuid = Guid.NewGuid();

返回一个新的指南,例如{6d4b8668-51ca-40eb-b013-9e7f96b82b68}。

在ProjectNode类的Reload方法中,方法this.SetProjectGuidFromProjectFile()被触发,然后抛出异常,如上所示。如果我在SimpleProject.myproj中取出<ProjectGuid>$guid1$</ProjectGuid>,我会毫无例外地进入应用程序,但是你没有与应用程序关联的guid,如果试图访问新创建的应用程序的属性页面,将会收到错误。 .myproj可能无法正确注册?我花了一周时间通过各种博客和论坛研究这个主题。

1 个答案:

答案 0 :(得分:3)

问题来自于MPF(这是一个非常糟糕的代码片段 - 不幸的是,它是唯一可用的完整样本)实现了自定义模板参数替换过程(这里描述的Visual Studio特定过程:{ {3}})仅支持替换所有项目(子)项目,但不支持项目项目本身。因此,您不能在xxxx.myproj文件中使用$ guid1 $或任何其他$ thingy $。

正如您所知,最简单的方法是删除此$ guid1 $参数,并将其留空,因为MPF支持空白:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    ...
    <ProjectGuid></ProjectGuid>
    ...
  </PropertyGroup>
  ...
</Project>

现在,与你的信念相反:)这很好用。这将设置ProjectIDGuid ProjectNode的属性。

你追求的属性页面是一个完全不同的野兽。为简化起见,Visual Studio将在您的层次结构中查询http://msdn.microsoft.com/en-us/library/eehb4faa.aspx属性。默认情况下,MPF实现它:

    /// <summary>
    /// List of Guids of the config independent property pages. It is called by the GetProperty for VSHPROPID_PropertyPagesCLSIDList property.
    /// </summary>
    /// <returns></returns>
    protected virtual Guid[] GetConfigurationIndependentPropertyPages()
    {
        return new Guid[] { Guid.Empty };
    }

Guid.Empty是一个糟糕的选择(他们可能只发送一个空数组),因为它会引发以下错误,这很难用标准的空guid诊断我们不知道它来自哪里:

enter image description here

所以,你需要做的是覆盖GetConfigurationIndependentPropertyPages并给它另一个Guid,它对应于一个派生自SettingsPage等的类,但这是另一个故事。