2012-03-26 65 views
2

我正在開發使用DirectX進行圖形渲染的應用程序。我必須指出,我沒有使用XNA或SlimDX,儘管我可能應該這樣做。但是,在項目啓動時我不知道這一點,現在已經太晚了,因爲需要很長時間才能轉換爲其中的任何一個。部署使用DirectX程序集的C#應用​​程序

也就是說,我需要將應用程序部署到用戶。在我的項目,我引用如下組件:

  • Microsoft.DirectX
  • Microsoft.DirectX.Direct3D
  • Microsoft.DirectX.Direct3DX

我只需要這些組件,閒來無事。用戶需要在其計算機上安裝DirectX作爲先決條件。因此,我發現將這些DirectX DLL包含到我的應用程序文件夾或GAC中是不必要的。

我遇到了一些環境問題,而其他工作完美。我追溯了DirectX程序集是否在%windir%\ assembly中註冊的問題。如果此處列出了DirectX程序集,則運行該應用程序。如果沒有 - 它無法啓動。

問題是,即使DirectX安裝在所有計算機上(dxdiag的作品,其中列出了DirectX文件),其中一些計算機中沒有列出這些程序集。發生這種情況時,應用程序失敗,System.IO.FileNotFound例外:

無法加載文件或程序集「Microsoft.DirectX.Direct3D,版本= 1.0.2902.0,文化=中性公鑰= 31bf3856ad364e35」或一個的依賴關係。該系統找不到指定的文件。

例如,如果最新的獨立安裝程序是從Microsoft網站下載並安裝的,則會註冊程序集。當他們沒有安裝時,我不確定這種情況,但它發生了。經常。

我的問題:

  1. 爲什麼有時的DirectX註冊這些組件有時不?
  2. 從 應用程序中引用DirectX程序集的正確方法是什麼?
+0

它們是不同機器和開發PC上的相同組件版本嗎? – 2012-03-26 10:34:25

+0

@Adam其實,我不確定。我的目標是可以追溯到2005年的DirectX 9 DLL。一些用戶正在安裝DirectX 11(當然這是更新的),並且應用程序失敗。我認爲更新版本的DirectX應該安裝所有以前的DLL版本,以便允許應用程序兼容性。如果不是這種情況,我不得不引用多個版本的程序集。我對嗎? – 2012-03-26 11:10:16

+0

從DirectX文檔看,它看起來好像部署了每個版本。你有沒有想過在你的安裝包中包含DirectX安裝。按照http://msdn.microsoft.com/en-us/library/windows/desktop/ee416644(v=vs.85).aspx – 2012-03-26 11:52:03

回答

2

我不驚訝你看到這些問題。您依賴於一個非常陳舊,停產且不再受到支持的API。最新的運行時安裝程序仍會安裝程序集以達到兼容目的,但它們並未默認包含在內,因爲它們不希望任何人使用它們。

老實說,他們真的很老(10歲),他們有許多已知的錯誤和問題,將永遠不會被修復,並有完全可以接受的替代品。只要你繼續支持你的應用程序,你就應該切換到其中的一個或者辭職以處理類似的問題。

+0

您是否在說安裝程序集只能由脫機運行時安裝程序完成,並且已過時?因爲那符合我在客戶端計算機上遇到的模式。正如我已經說過的,我知道使用Managed DirectX不再支持,但希望我仍然能夠使用它(我真的沒有使用任何先進的DirectX技術,只是一個普通的2D渲染)。如果你是對的,運行離線安裝程序必須在客戶端計算機上強制執行。 – 2012-04-01 10:44:12

+0

我不知道,因爲我使用它已經很長時間了。找出最好的方法是建立一個快速虛擬機並運行各種安裝程序,並檢查哪些安裝託管的DLL。 – MikeP 2012-04-01 14:11:28

+0

雖然你的回答並沒有解決我的問題,但你是對的非常明顯,我不應該使用過時的庫。感謝讓我意識到這一點。 PS。裝配僅由脫機安裝程序安裝。 – 2012-05-23 11:26:51

2

我曾經經歷過類似SimConnect DLL的飛行模擬器的一部分。在這種情況下,事實證明,如果用戶在安裝.Net框架之前安裝了Flight Simulator,則該DLL不會添加到GAC中。

我的猜測是這裏發生了類似的事情。

這當然意味着它只能在默認沒有.Net的XP系統上發生,並且在.Net安裝完成後重新安裝DX後應該修復。

+0

不幸的是,這個問題也發生在Windows 7上。你是對的,在這個系統上默認安裝.NET,所以在我的情況下這不能成爲問題的根源。儘管如此,感謝您的洞察力。 – 2012-03-26 11:18:50

+0

我遇到同樣的問題,唯一的邏輯解決方案是安裝Directx,@ Daniel-van-os是對的。這肯定會解決問題,但Directx存在兼容性問題,主要問題是我的軟件將安裝在許多PC中,並且不能將Directx作爲先決條件添加。所以再見Directx,我會看到另一個解決方案:)。 – Samidjo 2013-01-26 09:16:30