2014-10-31 88 views
1

我用Oracle查詢構建了一個小的控制檯應用程序,所以我添加了對Oracle.DataAccess的引用。當我發佈並安裝我的應用其他機器時,我運行了一個未處理的異常,並且抱怨Oracle.DataAccess不在GAC全局程序集緩存中。不知道如何解決GAC,甚至不知道究竟是什麼,我試圖將Oracle dll添加到我的應用程序。所以我在我的項目中創建了一個名爲dll的目錄來存儲該dll。我刪除了對Oracle.DataAccess的引用,並添加了對當地dll/Oracle.DataAccess.dll的引用。建立應用程序與本地DLL沒有全局程序集緩存

運行發佈後,確實會複製dll。

我就確定調整項目Properties,標籤Publish,按鈕Application Files設置:刪除舊條目Oracle.DataAccess.dl升並檢查dll/Oracle.DataAccess.dll有發佈狀態=包括(自動)。

但是,這不起作用。在另一臺機器上,該應用程序僅在安裝在c:\oracle的某處時纔可用。

我的問題是:我如何包含一個(這個)dll到一個項目,以便它不必安裝在機器上或位於c:\ oracle?

或者:我需要知道關於GAC才能解決這個問題嗎?

+0

'Oracle.DataAccess.dll'只是封裝客戶端機器上預計會_installed_的非託管庫。最簡潔的解決方案就是確保Oracle數據訪問組件與您的應用程序一起安裝。 – 2014-10-31 13:27:42

+0

我認爲問題在於程序集「Oracle.DataAccess」使用了一些注意事項 - 您的項目引用只有沒有程序集的「Oracle.DataAccess」,即「Oracle.DataAccess」。請參閱在原始目錄中oracle旁邊的程序集,並嘗試複製它們。 – 2014-10-31 13:28:05

回答

0

我們在我的公司做的方式 - 這可能不是最適合每個人的方式 - 是分開安裝第三方軟件。您的應用程序實際上並不直接引用第三方DLL,而是引用了一個「運行時可調用的封裝器」(RCW),它在您將項目添加到引用的第三方DLL時自動生成;因此,您的應用程序正在尋找,例如,「Interop.Oracle.DataAccess.DLL」在GAC或輸出目錄中,然後「Interop.Oracle.DataAccess.DLL」正在尋找第三方服務器, 「C:\ Oracle」中的第三方「Oracle.DataAccess.DLL」。

我們單獨安裝第三方軟件的原因是我們可以獨立於我們自己的定製軟件進行管理。像安裝Windows功能一樣查看它,以便使您的自定義應用程序可用。

因此,要將這種情況應用於您的情況,您需要通過例如由桌面或網絡管理員推出的MSI來安裝Oracle Data Access(不確定標題適合什麼,但是它是負責部署第三方軟件和Windows更新)。然後,您的應用程序將分開安裝,包括您的RCW DLL在您的應用程序目錄(忘記GAC),它應該正常工作。

當然,此解決方案對於部署在公司中的應用程序更適用於由IT成員團隊控制的多個桌面。這聽起來像你的情況是範圍小得多,所以你當然可以將Oracle組件與應用程序一起安裝,而不是單獨安裝。但是,總體思路保持不變:它們仍應該部署到「自然」位置(c:\ Oracle),然後由RCW在您的輸出目錄中引用。

+0

永遠不要想到引用其他DLL的DLL。在Linux中,有一個工具'ldd'(DLL中的文字遊戲),它以非常簡單的方式向您顯示所有庫依賴關係,包括子依賴關係。我希望窗戶有類似的簡單。 – Roland 2014-10-31 14:09:45

+1

那麼,公平地說,我們所談論的並不是一個引用另一個DLL的DLL,儘管這很常見 - .NET框架本身只是一組DLL,所以當你構建你的應用程序時,你只是在做那。它更像是包裝而不是傳統意義上的參考。 .NET互操作性是它自己的一個野獸,也是一個非常廣泛的話題。你應該看看Sysinternals「Process Explorer」(http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)。它能夠向您顯示進程使用的所有DLL。這很有啓發性。 – 2014-10-31 14:15:17

+0

使用它,你可以看到你的「簡單」應用程序實際上引用了10或100個DLL,因爲每個DLL本身都引用它們自己的DLL等等。 – 2014-10-31 14:17:38

相關問題