Windows窗体设计器:无法加载文件或程序集

48 windows-forms-designer visual-studio

有没有人遇到过在Visual Studio .NET中尝试在Windows窗体上"查看设计器"导致错误的问题:"无法加载文件或程序集......"

在这种情况下,有问题的组件是XYZ.dll.我设法通过添加XYZ.dll及其对项目引用的所有引用来解决这个问题(即使我的项目不直接依赖于它们)并重建整个解决方案.然而,在那之后,我从我的项目中删除了所有这些引用,重建,它仍然有效.

另一条信息是我使用Resharper 2.5.其他人指出,可能是Resharper做了一些影子复制.我下次会发生这种情况.有没有人首先理解为什么会发生这种错误,并且可能是"正确"的解决方法?

TcK*_*cKs 30

我们有同样的问题.在设计器中无法查看某些Form/UserControl类,Visual Studio会导致各种异常.

有一个典型的原因:一个设计组件在初始化期间抛出未处理的异常(在构造函数中或在Load事件中或之前).

不仅对于这种情况,你可以运行visual studio的另一个实例,打开/创建一些独立项目,转到菜单 - >调试 - >附加到进程... - >选择具有问题设计器的devenv.exe进程实例.然后按Ctrl + Alt + E,应显示"异常"窗口.在异常类别中检查"Thrown".

现在,设计师和尝试视图设计师活跃视觉工作室.如果抛出异常,您将看到callstack(可能是源代码,如果从代码中抛出异常)以及有关抛出异常的其他典型信息.这些信息可能非常有用.

  • 哇!通过您的解决方案,我可以在引擎盖下的意外项目中找到导致错误的确切代码行,但从未想过这可能是一个问题。 (2认同)

J C*_*ins 24

这是一个仍然没有答案的旧问题,无论是在这里还是在更广泛的论坛池中,大多数建议都与无情的清理>重建或关闭>清理文件夹>重新打开或重新启动机器有关.我目前没有一个可靠的答案,虽然已经做了一些研究,并认为我可能会分享.总而言之,在设计控件或表单时,有一个位置将所有设计器文件复制到该位置,旧文件可以存在的另一个位置以及描述方法以在设计者生成错误页面之前捕获所有设计器异常.

似乎有两种情况是装配不能装或无法找到.第一种是由于文件无法复制到设计人员所需的位置造成的,第二种是遗留下来的过时文件.

如上所述,当项目无法直接引用其引用的引用及其引用所需的所有引用(递归地)到框架时,文件可能无法复制.通过仔细跟踪所有参考文献及其家属,可以减轻这一点,确保所有参考文献都得到解决.

Visual Studio设计器使用特定位置来缓存dll,以便在设计器中使用它,与项目的source/bin文件夹隔离:

Windows XP:

C:\ Documents and Settings\[user_name]\Local Settings\Application Data\Microsoft\VisualStudio\10.0\ProjectAssemblies

Windows 7的:

C:\用户\ [USER_NAME] \应用程序数据\本地\微软\ VisualStudio的\ 10.0\ProjectAssemblies

在此位置,已编译的程序集将复制到动态创建的文件夹,每个程序集一个文件夹.检查此位置上的程序集版本日期,它似乎是最新的,当visual studio退出时被删除.使用新编译的文件查看设计器时,将复制所有程序集.每个程序集的每个程序集的新副本都会在此位置进行,因此该位置可能包含每个程序集的多个相同副本.

然而,存在另一个位置,其中可以复制程序集,并且它是程序集搜索序列的一部分,显然位于ProjectAssemblies文件夹之前,并且位于:

C:\ Program Files\Microsoft Visual Studio 10.0\Common7\IDE

我不知道如何或何时将程序集复制到此位置,但通常不会将文件到达此处的内容快速成为过时引用的来源.当设计人员因"无法加载文件或程序集"错误而失败时,设计人员寻求的版本只是该位置的程序集引用的版本.

这是通过在第一个上使用第二个Visual Studio实例调试,加载了所有.net符号,以及所有已知异常中断而不是未处理时发现的.这允许第二个实例拦截处理的设计器异常并显示该文件位置.这是我使用的设计器错误的结果输出:

=== Pre-bind state information ===
LOG: User = **************
LOG: DisplayName = ***********, Version=1.0.4275.22699, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/Program Files/Microsoft Visual Studio 10.0/Common7/IDE/
LOG: Initial PrivatePath = NULL
Calling assembly : ***********, Version=1.0.4275.22699, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: The same bind was seen before, and was failed with hr = 0x80070002.
Run Code Online (Sandbox Code Playgroud)

  • 确实,这不是一个答案,尽管这也不是一个问题.也许stackoverflow等人需要一个关于贡献者可以集体努力解决问题的"讨论"部分? (3认同)
  • 谢谢,清除AppData下的文件夹为我解决了问题. (3认同)

Ray*_*boe 12

对我有帮助的是删除解决方案中所有项目的所有bin和obj目录.同时删除C:\ Users \\ AppData\Local\Microsoft\VisualStudio\9.0\ProjectAssemblies中的文件夹,如前所述.VS2008使用9.0,VS2010使用10.0等


Den*_*nis 8

在这个问题上挣扎了几个小时。这是我学到的:检查设计者试图加载的 DLL 是否为 64 位 DLL

事实证明,嗯,现在对我来说很明显,VS 是一个 32 位应用程序,因此 VS 设计器 - 令人惊讶!惊喜!也是一个 32 位应用程序,所以如果你有一个 UserControl 或其他 WinForms 控件,它有一个 64 位 DLL 的引用——这是一个很大的禁忌,它会导致你的表单不在 VS 设计器中呈现并产生无法加载文件或程序集错误。因此,您应该做的第一件事是确保设计者抱怨的 DLL不是64 位 DLL。

  • 在 VS 2022(64 位)中遇到了相反的问题。Designer 在尝试加载 32 位 tlbimp dll 时崩溃。 (2认同)

Dea*_*ill 5

使用VS 2005,我遇到了同样的问题.我执行了Chien在原始问题中列出的步骤,但在关闭VS并重新打开解决方案之前,它仍然无效.现在Designer视图看起来很好.


San*_*ino 2

我在 VS2005 上经常发生这种情况,特别是在 winform 中添加自定义控件时。通常我只需要重建,不需要添加额外的引用,或者关闭并重新打开 VS。

没有明显的原因,只是 VS 的错误。