2013-09-21 21 views
1

我做了一個使用SQLite的WPF程序。通過使用Visual Studio 2012,它將生成DebugRelease版本的exe文件。當我轉到DebugRelease目錄並運行我的exe文件時,例如MultiStart.exe,它可以正常運行。爲什麼我的WPF程序無法在沒有Visual Studio的情況下運行?

但是,如果我將MultiStart.exe複製到我的桌面並嘗試運行它,則失敗。 通過幾次測試,我發現我還需要將文件MultiStart.exe.configSystem.Data.SQLite.dll複製到我的桌面。然後它現在可以運行。 但是爲什麼?我們是否有更好的解決方案,以便在沒有添加文件的情​​況下運行它? 謝謝!

+0

它可能取決於您的連接字符串的路徑 – Zeeshan

回答

1

爲什麼我的WPF程序不能沒有Visual Studio中運行?

問題標題並不真正準確,因爲它與Visual Studio沒有真正相關。 MultiStart.exe取決於配置(MultiStart.exe.config)以及其他組件(System.Data.SQLite.dll)。如果沒有這些依賴項,應用程序將無法運行(因爲這是.NET的工作原理)。

WPF並不一定需要一個配置文件才能運行,所以問題在於您的配置文件中應用程序需要什麼。將此配置信息移入代碼(例如連接字符串)並移除app.config可能是可能的,但這些值將在應用程序中被硬編碼。

就依賴程序集而言,可以將它們作爲資源嵌入,然後使用AppDomain.AssemblyResolve Event從資源中讀取程序集(有關示例,請參見Embedding assemblies inside another assembly)。

另一種方法是將資源合併爲一個程序集,而不是將資源嵌入到資源中。 ILMerge是合併程序集的流行選擇,但我讀過它可能會遇到WPF程序集問題(不確定是否適用於您)。有關使用WPF合併程序集的其他一些想法,請參閱Merging dlls into a single .exe with wpf

請注意,設置PATH變量不起作用,因爲.NET不使用PATH來解析程序集 - 有關詳細信息,請參見How the Runtime Locates Assemblies

另一個選項,而不是將MultiStart.exe複製到桌面上的方法是在桌面上使用鏈接到相應目錄的快捷方式。也許這是一個更簡單的解決方案

0

因爲你缺少PATH中的東西。 Visual Studio可能被設置爲將DLL複製到構建目標目錄。

你幾乎可以肯定地拉外部庫。其中一些是.NET的一部分,而其他一些則封裝在特定文件夾的庫中。當你啓動你的exe時,它會在你的PATH 中查找當前所有文件夾(包括複製的所有DLLs)。

當你將exe移動到桌面時,突然間它不知道這些DLL在哪裏。您沒有專門將它們添加到PATH中,並且它們不再位於當前文件夾中。這就是爲什麼將這些DLL複製到桌面上的原因。

除非你停止使用SQLite,否則沒有辦法讓你不需要該DLL(有很多方法可以打包/引用它)。

0

更好的解決方案,我用我的Windows窗體應用程序做的是,複製整個文件夾,其中包含支持文件。把它放在你想要的地方。然後在桌面上創建.exe的快捷方式。這對我而言總是有效的。

0

因爲你缺少一些依賴。您可以打開您的配置文件並設置依賴項...但我不建議您手動更改配置文件。 您也可以複製system32文件夾中的依賴dll。 ..但它只是一個竅門,因爲exe首先在當前文件夾中搜索dll而不是系統32文件夾。

1

您還可以使用ILMerge將所有依賴項合併到一個.exe文件中,以簡化應用程序的分發。在ILMerge

更多detaiils可以在這裏找到:使用的ILMerge on CodeProject

例子:ilmerge /target:winexe /out:YourDestinationApp.exe YourCurrentProgram.exe System.Data.SQLite.dll

相關問題