2013-03-03 27 views
2

我已經構建了一個程序,它將使用MediaInfo.dll讀取mkv文件的一些視頻和音頻信息。C#發佈MediaInfo.dll應用程序

該程序運行完美,從源代碼運行時,dll放在bin文件夾中。

現在我想發佈我的應用程序,並能夠繼續使用它。 MediaInfo.dll庫不再被發現。我嘗試將它放在C:\WIndows\C:\Windows\system32中,但沒有運氣。如果我運行安裝程序(發佈後)該程序安裝在相同的位置(我不想這個,但這是另一個問題)。我試着將dll放入該文件夾中。

被扔我的錯誤代碼是:

try{ 
    Handle = MediaInfo_New(); 
} 
catch (Exception ex){ 
       Handle = (IntPtr)0; 
Console.Out.WriteLine(ex.ToString()); 
} 

錯誤拋出是System.BadImageFormatExceptionSystem.DllNotFoundException: Unable to load DLL 'MediaInfo.dll'

任何想法在哪裏放置DLL?

+0

如何將bin目錄內的所有文件複製到其他計算機? – Habibillah 2013-03-03 10:34:40

+0

無法正常工作。任何其他想法? – 2013-03-03 10:36:39

+0

是否有一個innerException可能有更準確的錯誤描述? – Tearsdontfalls 2013-03-03 11:33:42

回答

4

您需要將DLL部署到複製EXE的同一目錄中。

由於您在引導64位版本的Windows的計算機上部署程序,因此您在BadImageFormatException中遇到問題並且未看到c:\ windows \ system32工作。但是,您的程序無法以64位模式運行,您依賴於32位本機代碼。您需要通過強制程序以32位模式運行來解決這個問題。右鍵單擊您的EXE項目,屬性,生成選項卡,將平臺目標設置更改爲x86。將DLL複製到Windows目錄是一個非常糟糕的主意,但在這樣的機器上是c:\ windows \ syswow64。 總是支持本地部署,與EXE相同的目錄。

如果在此之後仍然遇到DllNotFoundException,那麼可能的問題是MediaInfo.dll本身對另一個DLL有依賴性。這是很常見的,存儲C運行庫的DLL是非常常見的依賴項。如果您不知道可能的DLL是什麼,那麼您可以使用SysInternals的ProcMon實用程序。你會看到程序搜索DLL並沒有找到它。

1

您可以嘗試的如下─

1一個)將MediaInfo.dll在相同的位置的可執行文件。確保您的程序是爲正確的目標平臺而構建的。通常當目標平臺和二進制文件在體系結構(x86 v/s x64)中不匹配時,我已經看到了BadImageFormatException。打包依賴通常會照顧到這一點。

2)註冊MediaInfo.dll目標機器的Global Assembly Cache。這可以通過安裝程序完成,或者僅使用gacutil.exe。這將使dll對目標機器上的所有程序集都可見。