【问题标题】:Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) in VS Extensibility walkthroughGuid 在 VS 可扩展性演练中应包含 32 位数字和 4 个破折号 (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
【发布时间】:2014-06-10 18:37:12
【问题描述】:

我正在使用 演练:第 1 部分 - 创建基本项目系统,完全按照网站 http://msdn.microsoft.com/en-us/library/cc512961.aspxManaged Package Framework for Projects 中的说明 与从http://mpfproj11.codeplex.com/ 下载的完全相同。我已经在 Visual Studio 2013 中的多台开发机器上测试了演练。我还在 Visual Studio 2010 和 2012 中使用它们各自的 SDK 进行了测试。在每个测试中都会出现相同的问题。

问题:我收到异常 - 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 正在返回来自 SimpleProject.myproj 中 <ProjectGuid>$guid1$</ProjectGuid> 的字符串“$guid1$”。

ProjectNode类的Load方法中的断点表明

this.projectIdGuid = Guid.NewGuid();

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

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

【问题讨论】:

  • 你必须硬编码,不是吗?
  • $guid1$ 必须在代码中的其他位置自动或手动替换为真实的 GUID。
  • 据我了解,$guid1$ 应该用新创建的 guid 的就地代码替换。例如,如果我将 .myproj 更改为 .csproj,则 $guid1$ 将替换为新创建的 guid。但是,program.cs 中的 $namespace$ 和 $class$ 不会被替换。本演练的部分目的是创建和注册您自己的项目类型。在演练中它是 .myproj。如果我将 guid 硬编码到 SimpleProject.myproj 中,那么从此项目类型创建的每个项目都将具有相同的应用程序 guid。
  • 每期请提出一个问题。并请说明你问的是什么问题。这样的问题不适合。
  • 根据您的要求删除了第 2 期。将仅在单独的 postm 上与问题 2 重复问题

标签: c# visual-studio vsx


【解决方案1】:

问题来自 MPF(这是一段严重的蹩脚代码 - 不幸的是,它是唯一可用的完整示例)实现了自定义模板参数替换过程(此处描述的 Visual Studio 特定过程:@ 987654321@) 仅支持替换所有项目(子)项,但不支持替换项目项本身。因此,您不能在 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 将在您的层次结构中查询 __VSHPROPID2.VSHPROPID_PropertyPagesCLSIDList 属性。默认情况下,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 很难诊断:

因此,您需要做的是覆盖 GetConfigurationIndependentPropertyPages 并为其提供另一个 Guid,该 Guid 对应于派生自 SettingsPage 等的类,但这是另一回事。

【讨论】:

  • 嗨,西蒙,你能看看这个 StackOverflow 问题吗?它与同一种 GUID 相关警报有关! stackoverflow.com/questions/47797793/… 谢谢!
  • @KasunRandika - 错误是相同的,因为 guid 解析在 .NET 平台上的任何地方都是相同的,但我认为它没有任何关系。帮不了你,抱歉,我没有 Mac :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
相关资源
最近更新 更多