2010-10-25 80 views
4

這裏的設置:無法訪問Linux的gcc編譯的.so共享庫,從Windows單C#項目

我有一個共享庫(C++與外部的「C」的方法),我編譯Linux和創建一個library.so文件。

我用單在同一機器(Ubuntu的)發展,並能的DllImport(「library.so」),並訪問我的extern函數沒有問題。

的問題出現時,我複製的.so文件到Windows機器(Win7的),我嘗試做同樣的事情,但隨着MonoDevelop的Windows下這一次運行單。

我得到一個System.BadImageFormatException。我試過在library.so文件之前做一個「./」,但沒有任何幫助。我已經檢查並確認它正在查看正確的目錄。

有什麼大的我失蹤我爲什麼不能在Windows /單聲道訪問此.so文件?

回答

8

不能使用Windows上的。所以精靈二進制的本地代碼。您需要將其重新編譯爲Windows支持的本機二進制文件(即.dll)。

我建議你閱讀我們的wiki page about cross platform interop between managed an unmanaged code.

+0

我在想這是一件很大的事情。我希望Mono能以某種方式解決這個問題,而且它會工作。可能不會。感謝您的鏈接! – Nick 2010-10-25 17:55:28

+0

事情是Mono在P/Invokes時向操作系統下達「控制權」,所以沒有辦法解決這個問題。 – 2010-10-25 18:00:01

2

問題是Linux SO不是有效的Windows映像。您將需要在windows下編譯C++代碼作爲DLL並導出該方法,以便可以使用p/Invoke調用它。

C/C++是可移植的(大部分)在源代碼級別,而不是在二進制級別,所以你不能。所以到Windows複製一個Linux和期望這是在Windows平臺上的可執行文件。我確信這會產生一個問題,爲什麼你可以將.NET/Mono dll和exes從窗口複製到Linux並讓它們運行,這是因爲Mono CLI implmentation具有能夠從Windows映像加載IL的代碼( PE),然後在VM中執行加載的IL,所以在這種情況下,它不是正在執行的本地二進制代碼,而是從DLL/EXE容器文件加載的平臺相關IL。