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

时间:2008-10-03 13:19:58

标签: visual-studio windows-forms-designer

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

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

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

22 个答案:

答案 0 :(得分:30)

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

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

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

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

答案 1 :(得分: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符号,并且所有已知的异常都在throw上而不是在未处理时抛出。这允许第二个实例拦截处理的设计器异常并显示该文件位置。这是我使用的设计器错误的结果输出:

=== 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.

答案 2 :(得分:12)

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

答案 3 :(得分:5)

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

答案 4 :(得分:3)

几个小时一直在努力解决这个问题。这是我学到的:检查设计师正在尝试加载的DLL是64位DLL

事实证明,现在很明显,VS是一个32位应用程序,因此VS设计师 - 出乎意料!惊喜!也是一个32位应用程序,所以如果你有一个UserControl或其他WinForms控件,它引用了一个64位的DLL - 这是一个很大的NO - NO会导致你的表单不能在VS中呈现设计并生成无法加载文件或程序集错误。所以你应该做的第一件事就是确保Designer所抱怨的DLL是 NOT 64位DLL。

答案 5 :(得分:3)

我猜这个问题出于不同的原因,但我想我还是会分享我的情况。我希望有人能找到他们项目正在发生的事情的线索。

我的问题出现了,因为Visual Studio(C#项目)找不到托管的c ++ dll并将其复制到J Collins post =&gt;中提到的位置。设计师找不到该文件。我注意到它没有与其他DLL一起复制:s并发现它有一个不同/非标准的输出目录。将此更改为标准使Visual Studio执行副本。

答案 6 :(得分:2)

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

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

答案 7 :(得分:2)

我有类似的问题。

在我的例子中,我有一个基本表单,它引用了混合模式dll中的类(c ++托管包装到非托管库)。 我的派生表单没有正确加载,给出了上述相同的错误。

但是,以下问题解决了这个问题:http://support.microsoft.com/kb/967050

  1. 为Win32构建混合模式项目和ui项目。由于VS为32位,因此无法加载x64非托管代码:
  2. 清除ProjectAssemblies文件夹(需要首先关闭VS)
  3. 当您重新打开VS时,设计人员无需加载任何问题。请注意,默认情况下,C#项目编译为Any CPU,在Windows x64上编译为x64。

    希望这有助于某人。

答案 8 :(得分:1)

我在c ++ / cli项目中遇到过这个问题。

正如其他人所提到的,显然Windows窗体设计器在呈现之前实例化了某些版本的Form / Usercontrol。

如果表单设计器因任何原因无法实例化该类,则它将失败。所以我所做的是注释掉违规Usercontrol的构造函数,并重建我的项目。

这允许我再次使用表单设计器。

当然,您可以使用此方法有选择地注释掉构造函数的某些部分,直到识别出使表单设计器阻塞的部分,并在可能的情况下修复它。

答案 9 :(得分:0)

我发现,遇到这样的问题以及许多其他问题,问题往往围绕.NET框架安装。很多时候,例如在系统崩溃期间,文件可能会损坏esp。如果您关闭了虚拟内存。当C:\ WINDOWS \ Microsoft.NET文件夹中的文件损坏时,它们不能按预期方式工作,因为有很多这些文件,错误总是不会发生。文件的某些部分可能正常并加载,然后其他部分不。多年来,我发现在存档中保留Microsoft.NET文件夹的完整备份,这种存档具有某种类型的损坏保护对我来说很有效。您不会相信破坏.NET文件的内容会导致出错。几乎IDE的每个方面都取决于它的部分内容以及许多其他功能。当然,如果你没有备份,你应该卸载所有的NET框架安装(不要修复,因为这不保证文件被重写 - 文件可能会通过校验和和长度检查,但仍然是损坏的)。卸载后,重新启动系统,确保删除整个Microsoft.NET文件夹,如果没有,请自行删除(我必须这样做,一些文件仍然被遗忘)。完成后,重新安装.NET框架,根据您的操作系统,您可能无法摆脱整个事情。但是对于Windows XP,我知道你可以,我还没有在测试过程中在你自己的新操作系统上进行测试。我开始时安装2.0,然后安装3.5 SP1,依此类推,具体取决于您使用的Visual Studio。我坚持使用2008,因为它对我来说速度最快,并且仍然支持一些较新的东西,比如WPF,tr1等...希望这可以帮助你解决其他任何有.NET问题的人,错误信息往往会误导我但对我来说99%的时间是Microsoft.NET文件损坏。

答案 10 :(得分:0)

我遇到了同样的问题。 我从项目中删除了引用并再次添加,并且一切正常(在ptoject文件中我看到引用定义已更改,例如,“SpecificVersion”标记已添加并设置为“false”)。< / p>

答案 11 :(得分:0)

我在VS2005中看到过这种情况发生在Window Forms,ASP.NET和Compact Framework项目中。我正在构建的项目依赖于我的解决方案中的另一个程序集,但是抱怨它在尝试生成设计器文件时无法加载它。

我不确定具体原因,但有时会在我们提高程序集的版本号后发生。出于某种原因,Visual Studio不会将此程序集视为“新”,并且不会将新版本删除到当前项目的bin /文件夹中。但大部分时间都可以。

使用设计器错误删除项目的bin /文件夹(以及用于测量的obj /文件夹),然后重建,似乎会让伤害消失。

答案 12 :(得分:0)

对于将来遇到此问题且一直向下滚动搜索它的人:删除Appdata / Local / Microsoft / VisualStudio /.../ p>中的ComponentModelCache

答案 13 :(得分:0)

我多次遇到过这个问题。大多数时候clean+rebuild都有效(有时与重启Visual Studio相结合)。

clean+rebuild无效时,有两次:

问题#1

在我面临的一个案例中,它与C#和VB.NET有关。

我的表单中有几个用户控件没有加载到设计器中。用户控件在C#中。它们中的大多数都在相同的命名空间下,但很少有部分命名空间在字母大小写中不匹配。

例如:

userContorl1 was in myapp.mynamespace1, and 
userControl2 was in myapp.myNamespace1

对于C#,它们是不同的命名空间,因为C#区分大小写。但VB.NET不区分大小写。我得到的错误是在尝试加载myapp.mynamespace.userControl2时。经过长时间的挣扎,我注意到错误消息中的命名空间并在用户控件中进行了更正,使它们与'myapp.myNamespace1'相同,并且在clean+rebuild之后打开了中提琴设计器。

问题#2

我的表单(未打开)有很多用户控件。其中一个控件是具有枚举类型的属性。这个枚举是在泛型类中定义的。设计者为这个用户控件生成的代码类似于:

myUserControl1.SomeType = somenamespace.SomeGenericClass(of Date).SomeEnum

我在打开设计师时遇到的错误就像是:

  

无法加载类型   somenamespace.SomeGenericClass [System.Date] + SomeEnum

我将enum移到课堂外,并将设计师代码替换为:

myUserControl1.SomeType = somenamespace.SomeEnum

设计师开了。 :)

我希望这有助于某人。

答案 14 :(得分:0)

我会说这个帖子中的回复对我有所帮助,但并没有确切地说明我的自定义用户控件中发生了什么。

在我的特定情况下,我有许多辅助类库,它们执行诸如我的控件样式,后台日志记录以及执行常规事务的通用帮助程序类。

我正在使用其他一些库静态方法来处理错误情况下的日志记录。这是一个例子:

try { _InitializeStuff(); } catch (Exception ex) { Logger.Instance.Log("Couldn't instantiate: " + ex.Messsage); }

我在用户控件的构造函数,加载和属性集方法中做到了这一点......设计师无法始终构建静态方法调用的路径,因此设计人员会失败

我尝试在它周围放置DesignMode检查,但问题不是在运行时 - 它是设计时间,并且链接无法构建。对我来说,唯一的选择是在我的自定义用户控件的以下位置删除对我的静态助手类的所有引用:

  • 构造函数
  • 加载
  • 属性访问者

不幸的是,尝试使用辅助IDE调试此问题并使用“附加到进程”为我工作。

答案 15 :(得分:0)

我赞同Resharper的评论。我正在运行4.1。我禁用它,重新启动VS2008,再次尝试“转换为Web应用程序”,它运行良好。

答案 16 :(得分:0)

另外,请确保您在表单或控件中具有控件的库具有使用声明。一旦设计者知道它,它就会在Form.designer.cs文件中对对象的引用中写入完整的命名空间。

答案 17 :(得分:0)

我正在使用VS2005和VS2013并且看到了同样的问题。我的项目中的一些Visual Studio表单设计者工作,而其他人不会在设计模式下打开。在出现错误页面之前,一些打开尝试甚至使Visual Studio崩溃,说:

  

为了防止在加载设计器之前可能的数据丢失,   必须解决以下错误:

观察:
如果表单中有继承的组件,设计人员可能会停止工作

观察的伪代码示例:

...
using System.Windows.Forms; // UserControl

namespace MyNamespace
{
    public class MyForm : Form
    {
        public MyForm()
        {
            InitializeComponent();
            ...
        }

        private void InitializeComponent()
        {
            //this.ctrl = new MyNamespace.MyCtrl(); // Inherited class
            this.ctrl = new System.Windows.Forms.UserControl();
            ...
        }

        //private MyNamespace.MyCtrl myCtrl;        // Inherited class
        private UserControl ctrl;
    }

    public class MyCtrl : UserControl
    {
        ...
    }
}

在非伪代码实现中,我在MyCtrl中注释掉了继承的组件MyForm,而是使用了基类UserControl Visual Studio表单设计器再次开始工作!

如何在C#中正确编写 Visual Studio表单设计器 - 交互,继承的组件类超出我。但是,这种观察可能是某人的线索,他们可以解决这个问题。

答案 18 :(得分:0)

我尝试了上面有关删除文件,重新制作,重新启动等的许多建议。我的问题是它无法加载解决方案中的一些项目使用的实用程序集。另一个项目有共同控制。因此,Form1引用了ControlsAssembly1引用的UtilityAssembly1。 .resx文件具有UtilityAssembly1中的类型属性。我删除了包含这些类型的资源。试图再次打开表单(由于缺少资源而得到Null Reference异常),点击Ignore and Continue并解决了我的问题。

答案 19 :(得分:0)

为了让你的回归。 首先转到Visual Studio 2008命令提示符。

输入devenv /resetsettings
输入devenv /resetSkippkgs

  1. 在解决方案资源管理器中,单击“显示所有文件”
  2. 现在双击打开Form1.vb,然后单击+展开它。
  3. 打开Form1.Designer.vb
  4. 您可以在编辑器窗口(IDE)中看到两个选项卡。
  5. 现在右键单击选项卡“Form1.vb”并保存
  6. 同样右键单击选项卡Form1.vb [设计]并保存
  7. 重建您的项目。
  8. 重新启动Visual Studio。

答案 20 :(得分:0)

我遇到过这个问题。我做了上面所说的但是没有任何意义。然后我将程序集添加到引用中。重建项目。关闭Visual Studio。然后重新打开屏幕,设计师显得正常。

此致

答案 21 :(得分:0)

就此来报时。在我的其他项目打开并引用它的同时,我构建了UserControl的新版本。当我回头以引用用户控件的形式查看设计器时,它说找不到特定版本的.dll。

我很幸运,试图从工具箱中删除对该控件的引用。该代码可以很好地编译,但是设计者不会在没有错误的情况下显示代码。

尝试了以上所有方法,但没有效果。

表单的.res文件具有一些XML:

<data name="EventBar1.EventCheckedSubscriptions" mimetype="application/x-microsoft.net.object.binary.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAJoBbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1u
        ZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIG1zY29ybGliLCBWZXJzaW9u
        PTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUB
        AAAANlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkV2ZW50SGFuZGxlcgMA
        AAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uAwAAFVN5c3RlbS5FdmVudEhhbmRsZXJbXQgIAgAAAAkDAAAA
        AAAAAAAAAAAHAwAAAAABAAAAAAAAAAMTU3lzdGVtLkV2ZW50SGFuZGxlcgs=
</value>
  </data>
  <data name="EventBar1.EventLengthSubscriptions" mimetype="application/x-microsoft.net.object.binary.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAJoBbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1u
        ZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIG1zY29ybGliLCBWZXJzaW9u
        PTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUB
        AAAANlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkV2ZW50SGFuZGxlcgMA
        AAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uAwAAFVN5c3RlbS5FdmVudEhhbmRsZXJbXQgIAgAAAAkDAAAA
        AAAAAAAAAAAHAwAAAAABAAAAAAAAAAMTU3lzdGVtLkV2ZW50SGFuZGxlcgs=
</value>
  </data>
  <data name="EventBar1.EventLengthTypes" mimetype="application/x-microsoft.net.object.binary.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAKABY3RybENhbGVuZGFyU2lkZUJhciwgVmVyc2lvbj0xLjAuNzEy
        MS4yMTIzNCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0sIG1zY29ybGliLCBW
        ZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0
        ZTA4OQwDAAAAUWN0cmxDYWxlbmRhclNpZGVCYXIsIFZlcnNpb249MS4wLjcxMjEuMjEyMzQsIEN1bHR1
        cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAT1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5l
        cmljLkxpc3RgMVtbY3RybENhbGVuZGFyU2lkZUJhci5FdmVudEJhcitFdmVudExlbmd0aFR5cGUDAAAA
        Bl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAAC5jdHJsQ2FsZW5kYXJTaWRlQmFyLkV2ZW50QmFyK0V2ZW50
        TGVuZ3RoVHlwZVtdAwAAAAgIAgAAAAkEAAAAAAAAAAAAAAAHBAAAAAABAAAAAAAAAAQsY3RybENhbGVu
        ZGFyU2lkZUJhci5FdmVudEJhcitFdmVudExlbmd0aFR5cGUDAAAACw==
</value>
  </data>
  <data name="EventBar1.EventSettingsSubscriptions" mimetype="application/x-microsoft.net.object.binary.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAJoBbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1u
        ZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIG1zY29ybGliLCBWZXJzaW9u
        PTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQUB
        AAAANlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLkV2ZW50SGFuZGxlcgMA
        AAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uAwAAFVN5c3RlbS5FdmVudEhhbmRsZXJbXQgIAgAAAAkDAAAA
        AAAAAAAAAAAHAwAAAAABAAAAAAAAAAMTU3lzdGVtLkV2ZW50SGFuZGxlcgs=
</value>
  </data>

我从.res文件中删除了此文件,一切正常。在尝试之前,我确实备份了整个文件夹!