簡體   English   中英

WPF 應用程序部署 - 應用程序在另一台 PC 中啟動的問題

[英]WPF Application deployment - Problem with Application starting in another PC

全部,

我有一個基於 SQLite 數據庫和用戶/應用程序配置設置的 WPF 應用程序。 該應用程序在開發環境中構建並運行良好。 我創建了一個設置和部署項目,添加了上述應用程序的“項目輸出”,然后繼續創建設置。 應用程序和設置項目中的先決條件和 .NET 框架版本相同:

.NET 框架 3.5 客戶端配置文件 MS Visual Basic Powerpacks 10.0.0 Windows 安裝程序 3.1

但是,當我將它移到另一台安裝了相同 .NET 框架的 PC 上(但沒有開發環境)時,應用程序無法啟動。 它給出了“遇到問題並需要關閉”錯誤。 我發現這意味着應用程序中存在未捕獲的異常。 因此,我嘗試注釋掉應用程序中沒有處理它們的部分,只留下一個 window 來顯示(主 window 什么都不做),但應用程序失敗了。 我開始懷疑問題可能是應用程序啟動時沒有處理依賴關系。 這是我對他們所做的:

  1. SQLite 需要自動添加到“檢測到的依賴項”的 DLL 它被復制到應用程序目錄
  2. SQLite 數據庫手動添加到項目中,並將它們復制到應用程序目錄
  3. 不復制 Application.exe.config 文件。 我不知道把它們放在哪里

在這一點上,我想知道如何找出問題的根本原因。 我嘗試使用單個 window(並且沒有功能)運行另一個簡單的應用程序,它可以在目標機器上運行。 TIA

如果您認為問題出在依賴項上,那么可能值得看看“Assembly Binding Log Viewer” (即 fuslogvw.exe)。 該工具應該能夠准確地告訴您請求了哪些程序集以及如何滿足或不滿足請求。 問題是這只適用於托管程序集。

但是,如果您想找出未處理的異常是什么,那么您可以在應用程序入口點周圍包裝一個 try.. catch。 WPF 中的問題是這是由編譯器/Visual Studio 生成的,因此您通常無法更改它。 如果您確實想更改它,請嘗試嘗試.. 抓住它然后您需要(示例取自http://www.infosysblogs.com/microsoft/2008/09/how_to_write_custom_main_metho.html ):

  1. 找到 App.xaml 和 App.xaml.cs 文件
  2. 打開 App.xaml 的屬性頁面並將構建操作更改為“頁面”
  3. 在 App.xaml.cs 添加一個 Main() 方法,它應該如下所示:

     [STAThread] public static void Main() { var app = new App(); app.InitializeComponent(); app.Run(); }

如果您在整個方法主體周圍包裝一個 try..catch,那么您可以將錯誤信息寫入文本文件。 希望這將幫助您找出問題所在。

===== 編輯 =====

如果未處理的異常沒有被 try..catch 構造捕獲,那么它可能是一個活頁夾問題。 因為 JIT 編譯器根據需要編譯方法,它可能有助於將幾乎所有代碼移出入口方法。 例如:

<!-- language: lang-cs -->

    [STAThread]
    public static void Main()
    {
        try
        {
            MyMethod();
        }
        catch(Exception e)
        {
            // ... Write to file here
        }
    }

    private static void MyMethod()
    {
        // .. Do actual work here
    }

通過這樣做,您可以確保您在運行時嘗試定位正確的程序集等之前位於 try..catch 構造中。但是請注意,有些異常無法被捕獲(OutOfMemoryException、StackOverflowException 和其他一些) .

您是否考慮過為您的應用程序使用ClickOnce部署選項?

正如您從這個 SO question中看到的,應該可以將 SQLite DB 與 ClickOnce 應用程序捆綁在一起 您將獲得其他好處(如果您有興趣),例如自動更新。

如果您更改了 App.xaml.cs 的命名空間,而不是 App.xaml 的命名空間,也會出現此問題。 當您添加上面的代碼時,您就會知道,因為 InitializeComponent() 調用不會編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM