VS 2008 设计器失败:HRESULT E_FAIL 已从对 COM 组件的调用返回
VS 2008 designer failure: HRESULT E_FAIL has been returned from a call to a COM component
我正在使用带有一些更新的 VS 2008 SP1,在 C++/CLI 和 Winforms 中进行软件开发。我有一个 winforms 项目,设计师在打开时显示失败:
HRESULT E_FAIL has been returned from a call to a COM component
bei EnvDTE.CodeFunction.get_FunctionKind()
bei Microsoft.VisualC.CppCodeParser.OnTypePopulateMembers(Object sender, EventArgs e)
bei System.CodeDom.CodeTypeDeclaration.get_Members()
bei System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.Deserialize(IDesignerSerializationManager manager, CodeTypeDeclaration declaration)
bei System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager)
bei Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager)
bei System.ComponentModel.Design.Serialization.BasicDesignerLoader.BeginLoad(IDesignerLoaderHost host)
然后我可以单击 "ignore" 并查看我的整个 winforms,正确显示。但我不想总是忽略,因为它 1) 烦人,以及 2) 我也会忽略真正的失败,导致设计期间表单损坏(之前有过几次,浪费了数小时的开发时间)。 ..
同一解决方案中的另一个 winforms 项目没有设计器问题。
到目前为止我尝试过的:
- 删除 .ncb 和 .suo,删除 vcproj.user
- 清理临时文件夹和一些 VS 缓存文件夹。但我不知道还有哪些缓存文件夹存在,所以请在可能的答案中列出所有缓存文件夹。
- 移除winform所有控件,保留后台功能
- 正在解决方案中创建另一个项目,将文件复制到该文件夹
- 删除 .sln 解决方案文件,新建它
- 尝试使用第二个 VS 调试 VS,但即使我能够在按回车键打开错误表单后及时在第二个 VS 上按 break 按钮,我也只看到一堆汇编程序行。一点用都没有。
“解决了”问题:
- 正在从 winform 中删除所有控件,包括所有函数
- 在另一个解决方案中创建一个项目,在那里添加文件和必要的引用(它们保留在硬盘上的原始路径),而不是修改任何东西。这其实让我很困惑...
任何其他想法,我怎样才能消除那个失败?它显然在 VS 中,因为我可以编译并 运行 没有错误,甚至如上所述在另一个 VS 上查看表单。
但是我想保留我原来的VS解决方案而不是打开另一个。
我找到了问题的解决方案:
我有 2 个相关项目,其中一堆功能 100% 相同。在每个项目中,函数都属于主窗体 frmMain,因为窗体部分包含相同的控件。
我不喜欢复制和粘贴,但由于上述原因我无法将它们移动到 dll/assembly,所以我将这些功能外包到一个文件 frmMain.cpp.h
,我将其包含在两个项目 frmMain.cpp
:
proj_1\frmMain.cpp:
#include "frmMain.cpp.h"
proj_2\frmMain.cpp:
#include "..\proj_1\frmMain.cpp.h"
也许这不是最好的方法,但它工作得很好。即使在 VS 设计器中,它也已经工作了几个月。不知何故,#2 表单的设计者现在决定不再接受它。
我现在的解决方案是,我有该文件的 2 个副本。但是由于我是用SVN externals来创建第二个副本,我仍然可以避免复制和粘贴,设计师很乐意再次向我展示表格。
我正在使用带有一些更新的 VS 2008 SP1,在 C++/CLI 和 Winforms 中进行软件开发。我有一个 winforms 项目,设计师在打开时显示失败:
HRESULT E_FAIL has been returned from a call to a COM component
bei EnvDTE.CodeFunction.get_FunctionKind()
bei Microsoft.VisualC.CppCodeParser.OnTypePopulateMembers(Object sender, EventArgs e)
bei System.CodeDom.CodeTypeDeclaration.get_Members()
bei System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.Deserialize(IDesignerSerializationManager manager, CodeTypeDeclaration declaration)
bei System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager)
bei Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager)
bei System.ComponentModel.Design.Serialization.BasicDesignerLoader.BeginLoad(IDesignerLoaderHost host)
然后我可以单击 "ignore" 并查看我的整个 winforms,正确显示。但我不想总是忽略,因为它 1) 烦人,以及 2) 我也会忽略真正的失败,导致设计期间表单损坏(之前有过几次,浪费了数小时的开发时间)。 ..
同一解决方案中的另一个 winforms 项目没有设计器问题。
到目前为止我尝试过的:
- 删除 .ncb 和 .suo,删除 vcproj.user
- 清理临时文件夹和一些 VS 缓存文件夹。但我不知道还有哪些缓存文件夹存在,所以请在可能的答案中列出所有缓存文件夹。
- 移除winform所有控件,保留后台功能
- 正在解决方案中创建另一个项目,将文件复制到该文件夹
- 删除 .sln 解决方案文件,新建它
- 尝试使用第二个 VS 调试 VS,但即使我能够在按回车键打开错误表单后及时在第二个 VS 上按 break 按钮,我也只看到一堆汇编程序行。一点用都没有。
“解决了”问题:
- 正在从 winform 中删除所有控件,包括所有函数
- 在另一个解决方案中创建一个项目,在那里添加文件和必要的引用(它们保留在硬盘上的原始路径),而不是修改任何东西。这其实让我很困惑...
任何其他想法,我怎样才能消除那个失败?它显然在 VS 中,因为我可以编译并 运行 没有错误,甚至如上所述在另一个 VS 上查看表单。
但是我想保留我原来的VS解决方案而不是打开另一个。
我找到了问题的解决方案:
我有 2 个相关项目,其中一堆功能 100% 相同。在每个项目中,函数都属于主窗体 frmMain,因为窗体部分包含相同的控件。
我不喜欢复制和粘贴,但由于上述原因我无法将它们移动到 dll/assembly,所以我将这些功能外包到一个文件 frmMain.cpp.h
,我将其包含在两个项目 frmMain.cpp
:
proj_1\frmMain.cpp:
#include "frmMain.cpp.h"
proj_2\frmMain.cpp:
#include "..\proj_1\frmMain.cpp.h"
也许这不是最好的方法,但它工作得很好。即使在 VS 设计器中,它也已经工作了几个月。不知何故,#2 表单的设计者现在决定不再接受它。
我现在的解决方案是,我有该文件的 2 个副本。但是由于我是用SVN externals来创建第二个副本,我仍然可以避免复制和粘贴,设计师很乐意再次向我展示表格。