2012-06-01 53 views
2

我有一個相當基本(不超過100行)的Visual C#項目,但它包含一些第三方DLL引用。在開發的計算機上運行該項目運行得很好。如何完全發佈Visual C#項目?

在Microsoft Visual C#2010 Express中,我轉到Project->Publish <project name>,它生成一些文件,其中包括setup.exe安裝程序。

當我將這些文件移動到另一臺計算機並運行setup.exe時,它會正確安裝該程序。

但是當我運行該程序,它只是關閉了一句話:

ProjectName.exe has encountered a problem and needs to close. We are sorry for the inconvenience.

命令窗口中也出現了短短的一秒鐘一些錯誤,但它很難辨認出它是什麼說什麼。它看起來像這樣:

Unhandled Exception: System.Runtime.InteropServices.COMException: Retrieving the COM class factory for the component with CLSID { ....... } failed due to the following error: .....

我無法讓命令窗口留下來,所以我不能得到完整的消息。但我認爲這是由於其他計算機沒有這些第三方DLLS。

我怎樣纔能有Visual C#2010包一切包括DLL,所以這個錯誤不會出現?或者如果這可能不是真正的問題,我該如何阻止命令窗口立即消失? (我不知道所需DLL的完整列表)

或者,如果該DLL是在C:\ Windows \ system32下注冊的DLL,是否永遠不會將該項目構建到該包中?有沒有辦法看到它取決於什麼?

+0

這可能有助於:http://dependencywalker.com/(顯然你可能想要注意這個問題:http://stackoverflow.com/q/2557954/344286) –

+0

在VS2010中使用'Setup&Deploy Project'親與所有文件打包。 – uday

回答

3

Visual Studio 2010 Express不會創建完全功能的安裝程序,而只會創建ClickOnce安裝程序以及那些功能有限的安裝程序。這種安裝程序無法註冊COM DLL。

你的情況似乎是錯誤的是你正在使用一個未在目標系統上註冊的COM DLL。您可以嘗試在自己的程序中檢查它(例如嘗試創建類並捕獲由CreateObject函數引發的任何異常),並調用RegSvr32.exe/s以註冊它。或者,當你從DLL創建任何對象之前,程序第一次啓動時,只需執行此操作......但還沒有嘗試過。

您還可以確保在運行程序之前在目標系統上手動註冊DLL。

此外,當.Net使用COM DLL時,它通常會創建一個兼容性程序集,該程序集包裝COM DLL並使其可訪問.Net。如果您使用的DLL只是此兼容性程序集,則可能必須在系統上手動查找它所依賴的COM DLL,並將其明確包含在項目文件中。

爲了調試,在CreateObject上放置try/catch塊應該足夠了。如果這沒有幫助,請嘗試爲應用程序未處理異常時引發的事件添加事件處理程序(根據您創建的應用程序的類型,這可能會有所不同)。

+0

try/catch幫助阻止cmd窗口消失,我能夠看到錯誤。 – JBurace