回覆列表
  • 1 # 使用者2139874497017

      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

  • 中秋節和大豐收的關聯?
  • 雲,風旅行的句子?