我在许多地方看过,包括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();
我试图:
没有成功。
如何删除旧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>
清除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)
我迷路了。
我在整个磁盘中搜索字符串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>
(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)
尝试创建新的LineGraphControl
时出现错误消息:
ProcMon提取物:
答案 0 :(得分:4)
没有代码,没有异常消息,没有提示“LineGraphControl”可能是什么,你很难帮助你。我看了一下ZedGraph项目,看看可能会让你遇到麻烦。
不乏,这种控制存在很多问题。该代码几乎没有证据表明作者理解了设计时序列化。在“属性”窗口中可见的许多属性不应该是可见的,不可编辑(变灰)并且接受编辑但不进行序列化。一些属性被正确隐藏,暗示这是通过反复试验得出的。
最严重的是,项目中几乎每个类都是二进制序列化的。通过[Serializable]属性或实现ISerializable。但是不考虑与版本无关的序列化,[AssemblyVersion]属性会针对控件的每个版本进行更改,其有效版本号取决于构建程序集的时间。这是我在下载的版本中找到的内容:
[assembly: AssemblyVersion( "5.1.5.*" )]
这是你可以选择的最糟糕的版本策略,它甚至不能保证稳定增长的数字。当你从ZedGraphControl继承自己的控件并自己公开属性时,尤其是致命的,没有作者的试错方法的好处。 Winforms非常喜欢可序列化的类,它可以很容易地在设计时持久保存它们的对象。但是,随着程序集版本更改时所描述的结果,以前序列化的内容不再被反序列化。 Kaboom当您尝试打开用户控件或包含该控件的表单时,Visual Studio无法再找到所需的程序集。
是的,该版本号很难找回,它嵌入在.resx文件中的一个字符串中,该文件是项目的一部分。通过使用Convert.ToBase64String()对序列化字节进行编码来创建。该字符串只是一个随机的字母,你无法识别它的版本号。
具体建议:
答案 1 :(得分:2)
错误是找不到文件,like the one I helped out with the other day:
无法加载文件或程序集..系统找不到指定的文件。
打开ProcessMonitor并在VS赢得不允许您打开控件并抛出错误时运行它。失败后停止跟踪并调查ProcMon(Filemon)日志以查看IDE在哪里寻找它找不到的DLL。
将DLL放在预期找到的位置(这有望排除引用失败的VS库)。
进程监视器帮助在Resharper插件目录中发现了ZedGraph.dll的奇怪引用。我已按照以下步骤操作:
答案 2 :(得分:0)
项目中的另一个依赖项可能仍然专门引用旧版本的程序集。
如何定义Sakura.UI.Graphing.LineGraphControl的程序集/ DLL?