C#应用程序失败取决于使用哪台PC进行编译

时间:2014-03-13 14:49:33

标签: c# .net winforms telerik

一位同事使用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"包括无法在运行类型中解析的引用。那是对的吗?如果是这样,我们怎样才能找出造成问题的类型?

2 个答案:

答案 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)。它试图使用反射来查找文件,但不能。您是唯一一个可以确定缺少哪个文件的人。它是否告诉您行号和类存在问题?