我正在使用 演练:第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可能无法正确注册?我花了一周时间通过各种博客和论坛研究这个主题。
答案 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诊断我们不知道它来自哪里:
所以,你需要做的是覆盖GetConfigurationIndependentPropertyPages并给它另一个Guid,它对应于一个派生自SettingsPage等的类,但这是另一个故事。