2014-03-13 40 views
-1

一位同事使用Telerik控件製作了一個C#Windows窗體應用程序。應用程序在計算機「DevA」上編譯時在計算機「用戶」上運行,但在計算機「DevB」上編譯時不運行。根據使用哪臺PC編譯C#應用程序失敗

「用戶」 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[]) 

我認爲電腦「發展局」包括不能在運行類型解析的引用。那是對的嗎?如果是這樣,我們怎麼能找出造成這個問題的是什麼類型?

+0

您是否使用了一些源代碼管理?如果你是,你確定你已經檢查了所有的源代碼? x86和x64等兩種不同機器上的體系結構是否有所不同?最後一件事,你是否使用了相同版本的'Telerik',可能你可以在一臺機器上安裝一個補丁,但不能安裝在另一臺機器上。 – jacqijvv

+0

你需要確保所有refrenced DLL被複制到exe旁邊(特別是尋找Telerik的dll)我的猜測有些dll的缺失 –

+0

你可以使用http://technet.microsoft.com/en-us/sysinternals/bb896645 .aspx進行高級監控,以瞭解軟件所請求的文件是什麼,但未找到 –

回答

0

有一些文件(可能是一個dll),系統找不到。它試圖使用反射來查找文件,而不能。您是唯一可以確定丟失文件的人。它是否告訴你一個線路號碼和班級問題存在?

+0

該應用程序默默崩潰。 Windows事件日誌不會給我一個行號或類。 – Andomar

1

感謝Matt的評論,我們檢查了InnerException。有五個層次的內部例外。最內層包含錯誤:

{"Could not load file or assembly 'Telerik.OpenAccess, Version=2013.3.1320.1, Culture=neutral, PublicKeyToken=7ce17eeaf1d59342' or one of its dependencies. The system cannot find the file specified.":"Telerik.OpenAccess, Version=2013.3.1320.1, Culture=neutral, PublicKeyToken=7ce17eeaf1d59342"}

在Visual Studio中沒有對此程序集的引用。由於我們認爲參考必須來自某處,因此我們在源目錄上進行了純文本搜索。這個發現在.csproj文件中的以下行:

<Import Condition="Exists('$(MSBuildExtensionsPath)\OpenAccess.targets')" 
     Project="$(MSBuildExtensionsPath)\OpenAccess.targets" /> 

此行既存在對德瓦和發展局。該行似乎只在安裝在機器上時才導入Telerik OpenAccess。當DevA編譯時,條件是成立的,所以可執行文件最後引用Telerik.OpenAccess。 DevB編譯時,條件是錯誤的,所以沒有包含任何參考。

看來該項目已被修改爲刪除Telerik.OpenAccess,但Import指令已滯後。該問題已通過從.csproj中刪除Import行解決。現在該工具在任何一臺機器上編譯時都可以工作