自从dll更新以来,VS不会打开控制权

时间:2015-01-14 13:25:37

标签: c# visual-studio-2012

我在许多地方看过,包括google和SO,但我没有找到相关的答案。

我最近在我的应用程序中做了一些更改,包括更新ZedGraph dll(从5.1.4.26270到5.1.6.405),因此,VS不会打开我的控件抛出此错误:

  

无法加载文件或程序集' ZedGraph,Version = 5.1.4.26270,Culture = neutral,PublicKeyToken = ...'或其中一个依赖项。系统找不到指定的文件。

哪个指向旧版本。我看到无处不在,我找不到任何旧版本的痕迹。

它也会抛出此错误:

  

变量' lineGraphControl1'未申报或未分配。

我调用构造函数:

this.lineGraphControl1 = new Sakura.UI.Graphing.LineGraphControl();

我试图:

  • 重新启动
  • 清洁和再涂
  • 以管理员模式启动VS
  • 删除引用并重新添加

没有成功。

如何删除旧ZedGraph lib的跟踪以及如何修复此错误?

修改

这里是旧版本和旧版本(旧版本)之间的变化

<Reference Include="ZedGraph, Version=5.1.4.26270, Culture=neutral, PublicKeyToken=02a83cbd123fcd60, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\..\Lib\ZedGraph.dll</HintPath>
</Reference>

<Reference Include="ZedGraph, Version=5.1.6.405, Culture=neutral, PublicKeyToken=02a83cbd123fcd60, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\..\Lib\ZedGraph.dll</HintPath>
</Reference>

编辑2

清除VS的缓存并重新启动计算机后,错误消息已更改:

at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.EnsureDocument(IDesignerSerializationManager manager)
at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.DeferredLoadHandler.Microsoft.VisualStudio.TextManager.Interop.IVsTextBufferDataEvents.OnLoadCompleted(Int32 fReload) 

我迷路了。

编辑3

我在整个磁盘中搜索字符串5.1.4.26270,找到的唯一地点不在项目中。


csproj片段:

<Reference Include="ZedGraph, Version=5.1.6.405, Culture=neutral, PublicKeyToken=02a83cbd123fcd60, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\..\Lib\ZedGraph.dll</HintPath>
</Reference>

编辑4:

Hans Passant anwser之后)

这是LineGraphControl声明:

public class LineGraphControl : GraphControl<Sakura.Graphing.LineGraph>

LineGraph(使用ZedGraph对象)

public class LineGraph : Graph, ISerializable

图表:

[XmlInclude(typeof(StackedGraph))]
[XmlInclude(typeof(LineGraph))]
[XmlInclude(typeof(BubbleGraph))]
[XmlInclude(typeof(BatchGraph))]
[Serializable]
public abstract class Graph : ISerializable

不幸的是,ZedGraph lib与软件有很深的联系,可以将它改为另一个。

我不会回滚这些更改,因为我已经以一种使我的软件绘图速度提高250%的方式调整库。

这是在VS中打开LineGraphControl的试探性的callstack:

at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.EnsureDocument(IDesignerSerializationManager manager)
at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager)
at System.ComponentModel.Design.Serialization.BasicDesignerLoader.BeginLoad(IDesignerLoaderHost host)

Here's the activity log

尝试创建新的LineGraphControl时出现错误消息:

enter image description here

ProcMon提取物:

enter image description here

3 个答案:

答案 0 :(得分:4)

没有代码,没有异常消息,没有提示“LineGraphControl”可能是什么,你很难帮助你。我看了一下ZedGraph项目,看看可能会让你遇到麻烦。

不乏,这种控制存在很多问题。该代码几乎没有证据表明作者理解了设计时序列化。在“属性”窗口中可见的许多属性不应该是可见的,不可编辑(变灰)并且接受编辑但不进行序列化。一些属性被正确隐藏,暗示这是通过反复试验得出的。

最严重的是,项目中几乎每个类都是二进制序列化的。通过[Serializable]属性或实现ISerializable。但是不考虑与版本无关的序列化,[AssemblyVersion]属性会针对控件的每个版本进行更改,其有效版本号取决于构建程序集的时间。这是我在下载的版本中找到的内容:

 [assembly: AssemblyVersion( "5.1.5.*" )]

这是你可以选择的最糟糕的版本策略,它甚至不能保证稳定增长的数字。当你从ZedGraphControl继承自己的控件并自己公开属性时,尤其是致命的,没有作者的试错方法的好处。 Winforms非常喜欢可序列化的类,它可以很容易地在设计时持久保存它们的对象。但是,随着程序集版本更改时所描述的结果,以前序列化的内容不再被反序列化。 Kaboom当您尝试打开用户控件或包含该控件的表单时,Visual Studio无法再找到所需的程序集。

是的,该版本号很难找回,它嵌入在.resx文件中的一个字符串中,该文件是项目的一部分。通过使用Convert.ToBase64String()对序列化字节进行编码来创建。该字符串只是一个随机的字母,你无法识别它的版本号。

具体建议:

  • 一旦被咬,两次害羞,使用这种控制是一个巨大的责任。考虑其他因素,.NET Framework Chart控件相当不错。
  • 放弃更新版本并恢复原始,当然最简单的修复。
  • 签入控件的来源并将其添加到解决方案中。编辑AssemblyInfo.cs文件并在[AssemblyVersion]属性中硬编码“5.1.4.26270”。
  • 这应该有很多帮助,但不能保证先前序列化的数据仍然可以反序列化,这个类可能已经改变了。然后,您需要深入了解用户控件的.resx文件以及使用它的表单并查找Base64字符串。编写一个解码字符串的小程序,仔细检查您是否找到了正确的字符串。并从.resx文件中删除该条目。
  • 如果那还没有完成,那么你必须手动编辑Designer.cs文件。删除任何引用该控件的语句。然后,您应该能够在设计模式下打开它并添加控件。

答案 1 :(得分:2)

问题

错误是找不到文件like the one I helped out with the other day

  

无法加载文件或程序集..系统找不到指定的文件。

故障排除

打开ProcessMonitor并在VS赢得不允许您打开控件并抛出错误时运行它。失败后停止跟踪并调查ProcMon(Filemon)日志以查看IDE在哪里寻找它找不到的DLL。

解决方案

将DLL放在预期找到的位置(这有望排除引用失败的VS库)。


进程监视器帮助在Resharper插件目录中发现了ZedGraph.dll的奇怪引用。我已按照以下步骤操作:

  1. 禁用Resharper
  2. 重启VS
  3. 清洁&amp;重建
  4. 再次启用Resharper
  5. 微笑

答案 2 :(得分:0)

项目中的另一个依赖项可能仍然专门引用旧版本的程序集。

如何定义Sakura.UI.Graphing.LineGraphControl的程序集/ DLL?