2012-03-06 63 views
2

好的這個問題更多的是瞭解問題是什麼,因爲我不認爲任何人都能告訴我如何解決這個問題。嘗試在C中加載程序集的錯誤#

我正在寫一個.net 4應用程序,並且我有一個我想參考的第三方DLL(搭扣加密狗保護)。

Visual Studio允許我創建引用罰款並使用包含在我的代碼中的dll內的類。

第一個問題發生在程序運行和dll實際加載時。然後我得到以下錯誤。

System.BadImageFormatException:無法加載文件或程序集 hasp_net_windows.dll或其依賴項之一。不是有效的 Win32應用程序

weblink指出如何解決此錯誤。有人發現問題是什麼,爲什麼即時得到它。

按照這個建議之後,我將主項目構建設置爲x86,然後我得到另一個錯誤替換另一個錯誤。新的錯誤是:

System.IO.FileLoadException:混合模式組件建立對 版本運行的「V1.1.4322,且不能在4.0 運行時無需額外配置信息被加載

weblink指出如何解決這個錯誤,但我沒有在我的項目中的app.config,並希望儘可能避免有一個。如果有人能夠解釋什麼問題再次有幫助?

如果您需要更多信息,請讓我知道。

+0

爲什麼厭惡app.config? – 2012-03-06 09:39:50

+0

菜單構建,構建配置(不知道,我沒有在這裏VS),那麼對於解決方案中的每個項目,您必須定位x86模式。由於該dll的限制,您將無法創建64位應用程序。 – vulkanino 2012-03-06 09:40:27

回答

8

這個問題是你的應用程序的「缺點」。一旦選擇(32位或64位)全部該進程內的DLL 需要才能相同。這個異常告訴我,你的一個DLL是錯誤的「bitness」。

你根本不能在給定的進程中擁有不同的編譯目標的DLL,一個進程具有「比特」親和力。

如果這是第三方非託管DLL,那麼它很可能是32位編譯的。

將根目錄項目(創建exe的目錄)的生成輸出設置爲x86應該就足夠了,因爲這將決定創建的進程。任何其他.NET項目都可以簡單地變成任何CPU,並且適用於32位或64位運行時。

不幸的是,對於您的第二個問題,提供的鏈接是解決問題的方法。在項目中使用app.config並沒有什麼錯,而且你也沒有說明你爲什麼不需要它。

+0

我設法得到.net 4版本的dll。 – user589195 2012-03-12 14:42:04

+0

哪裏可以得到.net 4版本的hasp dll? – brianestey 2012-06-28 08:52:57

3

Adam Houldsworth的回答儘管如此,我還是想補充一點,可能沒有app.config。但是,這需要更多的工作,並且可能對COM互操作有正確的理解。當然是否值得這個麻煩取決於你;)。

您可以使用ICLRRuntimeInfo::BindAsLegacyV2Runtime方法以編程方式設置。

快速簡要介紹如何做到這一點is posted in this blogpost。注意到他警告,雖然,這可能會讓你覺得兩次在使用這種方法:

這種方法的工作原理,但我會很猶豫,使用它在公共 面臨的生產代碼,尤其是比其他任何 初始化您自己的應用程序。雖然這應該在 庫中工作,但使用它會產生非常令人討厭的副作用:您以非常明顯的方式更改正在執行的應用程序的運行時策略,並且該方法非常隱蔽。

+0

+1從來不知道。 – 2012-03-06 09:51:23

0

我無法使用app.config文件,因爲程序集是通過COM加載的。 我發現支持.net framework 4.0的庫。 here。在這種情況下,沒有其他解決方案爲我工作。

+0

請注意,[只有鏈接的答案](http://meta.stackoverflow.com/tags/link-only-answers/info)不鼓勵,所以答案應該是搜索解決方案的終點(vs.而另一個引用的中途停留時間往往會隨着時間推移而過時)。請考慮在此添加獨立的摘要,並將鏈接保留爲參考。 – kleopatra 2013-12-19 15:50:44

相關問題