一位同事使用Telerik控件制作了一个C#Windows Forms应用程序。该应用程序在计算机上运行" User"在计算机和#34; DevA"上编译时,但在计算机上编译时#34; DevB"。
"用户"未编译版本的Windows事件日志如下所示:
Application: OptionCeaserTool.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.FileNotFoundException
Stack:
at System.ModuleHandle.ResolveType(System.Reflection.RuntimeModule, Int32, IntPtr*, Int32, IntPtr*, Int32, System.Runtime.CompilerServices.ObjectHandleOnStack)
at System.ModuleHandle.ResolveTypeHandleInternal(System.Reflection.RuntimeModule, Int32, System.RuntimeTypeHandle[], System.RuntimeTypeHandle[])
at System.Reflection.RuntimeModule.ResolveType(Int32, System.Type[], System.Type[])
我认为计算机" DevB"包括无法在运行类型中解析的引用。那是对的吗?如果是这样,我们怎样才能找出造成问题的类型?
答案 0 :(得分:1)
感谢Matt的评论,我们检查了InnerException。有五个级别的内部异常。最里面包含错误:
{"无法加载文件或程序集' Telerik.OpenAccess, 版本= 2013.3.1320.1,文化=中立, 公钥= 7ce17eeaf1d59342'或其中一个依赖项。该 系统找不到指定的文件。":" Telerik.OpenAccess, 版本= 2013.3.1320.1,文化=中立, 公钥= 7ce17eeaf1d59342"}
Visual Studio中没有对此程序集的引用。由于我们认为引用必须来自某个地方,我们在源目录上进行了纯文本搜索。这在.csproj
文件中找到了以下行:
<Import Condition="Exists('$(MSBuildExtensionsPath)\OpenAccess.targets')"
Project="$(MSBuildExtensionsPath)\OpenAccess.targets" />
此行存在于DevA和DevB上。该线路似乎仅在机器上安装Telerik OpenAccess时导入。当DevA编译时,条件为真,因此可执行文件最终引用Telerik.OpenAccess
。当DevB编译时,条件为假,因此没有包含引用。
似乎项目已被修改为删除Telerik.OpenAccess
,但Import
指令已经落后了。通过从Import
删除.csproj
行解决了该问题。现在,该工具在任一计算机上编译时都能正常工作。
答案 1 :(得分:0)
系统找不到一些文件(可能是dll)。它试图使用反射来查找文件,但不能。您是唯一一个可以确定缺少哪个文件的人。它是否告诉您行号和类存在问题?