NET的程式是和Java一樣的託管程式碼,在底層操作上,具有很大的侷限性,像Java的JNI一樣,.NET具有Platform Invoke(平臺呼叫,通常叫P/Invoke)。本文中,Linux下的.NET託管程式碼執行在Mono CLR上。之所以做跨平臺的P/Invoke,是因為考慮到有些客戶在Win32/WinCE等系統中開發的.NET程式,需要換到Linux平臺執行。嵌入式開發中,經常需要操作IO,.NET程式就透過P/Invoke來呼叫一些用比如c/c++一類語言開發的native程式碼完成IO操作。這時候針對windows編寫的native程式碼,就不能不加修改的移植到Linux上,要完成這個移植工作就需要編寫Linux下的native程式碼。但如何做到不修改.NET程式呢,下面就讓筆者以例項講述。 要保證.NET程式不加修改,不許重新編譯,需要做到native程式碼具有一致的介面。比如我們有native.dll何libnative.so兩個不同系統下的動態連結庫,在.NET程式中,呼叫動態庫中的getSum(int a,int b)函式,則需要在native.dll和libnative.so中都存在getSum(int a, int b)函式,而且匯出的名字要一致,都是getSum。編譯時要注意編譯器對符號名稱的修飾,vc編譯器中,可以用Module-Defination File(.def)檔案來規範到處的函式名稱。 在.NET的程式碼中,透過DllImport引入外部函式時,指定的連結庫模組不要加副檔名。比如native.dll,只要寫native就好。windows中,會自動尋找native.dll,Linux下對應的是libnative.so。 以下是例項程式碼: using System; using System.Runtime.InteropServices; namespace Managed { class Program { [DllImport("native")] public static extern int getSum(int a, intb); static void Main(string[] args) { System.Console.WriteLine("Managed code out."); System.Console.WriteLine("1+2=" + getSum(1, 2)); } } } 上邊的程式碼演示了從外部動態連結庫引入函式的方式,注意沒有加副檔名。接下來在看看windows下的c程式碼是如何編寫的: /** * native.h 標頭檔案,宣告函式原型 */ #ifndef NATIVE_H #define NATIVE_H #ifdef __cplusplus extern "C" { #endif int __stdcall getSum(const int a, const intb); // 原型 #ifdef __cplusplus } #endif #endif /* * native.cpp * 2013-03-05 實現功能的程式碼 */ #include "native.h" #include
NET的程式是和Java一樣的託管程式碼,在底層操作上,具有很大的侷限性,像Java的JNI一樣,.NET具有Platform Invoke(平臺呼叫,通常叫P/Invoke)。本文中,Linux下的.NET託管程式碼執行在Mono CLR上。之所以做跨平臺的P/Invoke,是因為考慮到有些客戶在Win32/WinCE等系統中開發的.NET程式,需要換到Linux平臺執行。嵌入式開發中,經常需要操作IO,.NET程式就透過P/Invoke來呼叫一些用比如c/c++一類語言開發的native程式碼完成IO操作。這時候針對windows編寫的native程式碼,就不能不加修改的移植到Linux上,要完成這個移植工作就需要編寫Linux下的native程式碼。但如何做到不修改.NET程式呢,下面就讓筆者以例項講述。 要保證.NET程式不加修改,不許重新編譯,需要做到native程式碼具有一致的介面。比如我們有native.dll何libnative.so兩個不同系統下的動態連結庫,在.NET程式中,呼叫動態庫中的getSum(int a,int b)函式,則需要在native.dll和libnative.so中都存在getSum(int a, int b)函式,而且匯出的名字要一致,都是getSum。編譯時要注意編譯器對符號名稱的修飾,vc編譯器中,可以用Module-Defination File(.def)檔案來規範到處的函式名稱。 在.NET的程式碼中,透過DllImport引入外部函式時,指定的連結庫模組不要加副檔名。比如native.dll,只要寫native就好。windows中,會自動尋找native.dll,Linux下對應的是libnative.so。 以下是例項程式碼: using System; using System.Runtime.InteropServices; namespace Managed { class Program { [DllImport("native")] public static extern int getSum(int a, intb); static void Main(string[] args) { System.Console.WriteLine("Managed code out."); System.Console.WriteLine("1+2=" + getSum(1, 2)); } } } 上邊的程式碼演示了從外部動態連結庫引入函式的方式,注意沒有加副檔名。接下來在看看windows下的c程式碼是如何編寫的: /** * native.h 標頭檔案,宣告函式原型 */ #ifndef NATIVE_H #define NATIVE_H #ifdef __cplusplus extern "C" { #endif int __stdcall getSum(const int a, const intb); // 原型 #ifdef __cplusplus } #endif #endif /* * native.cpp * 2013-03-05 實現功能的程式碼 */ #include "native.h" #include