2012-07-05 59 views
3

嗨,我是C#世界的新手。我必須使用它,因爲依賴於來自多播源的xceedzip.dll壓縮數據。 將一些代碼用於接收提要後,我在調用此dll時遇到了一個障礙。 從我理解我需要使用「System.Reflection」並調用dll。C#模塊預計包含程序集清單

目前我的源代碼和dll駐留在同一目錄中。代碼編譯成功。

Assembly ass = Assembly.Load("XceedZip"); 

我在運行期間得到System.BadImageFormatException: 未能加載文件或程序集「XceedZip」或其依賴條件之一。預計該模塊將包含程序集清單。

請幫幫忙,謝謝

好嗎感謝所有您的答覆,我有以下裝入我的環境中TLBIMP命令的dll的工作版本。我在解壓縮方法簽名時遇到了麻煩。我需要提供一個「ref對象」和一個「out對象」作爲源(壓縮)和目標(未壓縮)對象。我嘗試將字節數組加載到這些位置,但它會引發無效的參數錯誤。幫助的「參考對象」和「out對象」感謝...

問題解決了,感謝所有

+0

好的問題,當它包含'後一起hacking一些代碼':-) – Maarten 2012-07-05 12:02:57

+0

xceed有.net特定的版本,你使用.net版本的壓縮? http://xceed.com/pages/TopMenu/Products/ProductSearch.aspx?Lang=EN-CA&Category=88a6e6f5-119c-4240-ab24-60913318cbd4 – Jake1164 2012-07-05 12:20:07

+0

我使用4.2版本 – 2012-07-05 12:28:14

回答

6

我懷疑這DLL不是託管程序集,但包含本地​​代碼。 Assembly.Load只能與託管程序集一起使用。如果您需要從非託管代碼調用函數,則可以使用P/Invoke。該過程涉及爲要調用的非託管函數定義託管包裝器。

例如,如果你想調用MessageBox本地函數(其實你永遠不會需要做到這一點,因爲已經有一個管理相當,但它應該是罰款,這個演示的目的),你可以寫一個包裝:

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
public static extern MessageBoxResult MessageBox(IntPtr hWnd, String text, String caption, int options); 

,然後調用它:

MessageBox(IntPtr.Zero, "Text", "Caption", 0); 

你會做同樣的事情,與包含在DLL中的非託管函數。您將不得不查看文檔以查看確切的非託管簽名,這將有助於您定義託管包裝。

+1

他們肯定是託管程序集。 Xceed沒有ZIP的任何非託管庫。 – JohnZaj 2012-07-05 12:22:48

+0

我回來了。我在我的Snagit目錄中發現了一個非託管的「XceedZip.dll」...但是,我沒有在Xceed Zip for .NET v5.1下載(試用版)中找到這個相同的DLL。 – JohnZaj 2012-07-05 12:34:04

+0

如果你'編輯'你的答案我會upvote你。它鎖定我,直到你編輯:\ – JohnZaj 2012-07-05 13:08:16

0

從我理解我需要使用「System.Reflection」並調用dll。

不,你不知道。您可以在項目中添加對DLL的引用(因爲它是is a managed assembly),然後使用DLL中的類及其方法。

您將收到關於使用什麼類和方法以及他們期望的參數的文檔。

我不會爲第一年支付640歐元,並且以後每年只需支付320歐元,這僅僅是一個ZIP庫,但這可能有點偏離主題。

+0

我並不反對,太糟糕了,交換機選擇傳輸數據在這個匆匆的giftwrap – 2012-07-05 12:14:08

+1

特別是因爲有完美的開源zip解決方案。 – Jake1164 2012-07-05 12:14:09

3

嘗試清理解決方案,然後重新構建。這對我來說很好。