这是一个似乎仍然没有答案的老问题,无论是在这里还是在更广泛的论坛池中,大多数建议都与无情的清理>重建或关闭>清理文件夹>重新打开或重新启动机器有关。我目前还没有一个可靠的答案,尽管已经对此进行了一些研究,并认为我可以分享。总而言之,当设计控件或表单时,所有设计器文件都复制到一个位置,旧文件可以存在的另一个位置,并且描述了在设计器生成错误页面之前捕获所有设计器异常的方法。
似乎有两种情况,无法加载或找不到程序集。第一个是由于文件无法复制到设计人员要求的位置,第二个是遗留的过时文件。
如上所述,当项目无法直接引用其引用的引用及其引用所需的所有引用时,文件可能无法复制,递归地向下到框架。这可以通过仔细跟踪所有参考及其家属来缓解,确保所有参考都得到考虑。
Visual Studio 设计器使用特定位置缓存 dll 以供其在设计器中使用,与项目的源 /bin 文件夹隔离:
视窗XP:
C:\Documents and Settings\[用户名]\Local Settings\Application Data\Microsoft\VisualStudio\10.0\ProjectAssemblies
Windows 7的:
C:\Users\[用户名]\AppData\Local\Microsoft\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.