成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談.NET互操作技術 重點托管代碼

開發 后端
本文將為大家講解.NET互操作技術,主要是.NET托管代碼和本地非托管代碼的互操作技術。

 多年來在程序設計領域微軟技術一直引領著每個時代,在每一代的技術背后都有相關的動機,而這些動機及其實現細節往往是大部分的程序設計課程沒有涉及的,但是對于我們理解相關的技術又十分重要,本文將對幾種相關技術和隱藏在動機背后的細節做簡要的闡述,算是拋磚引玉。

COM技術于1993年首次發布,稱得上是微軟技術的一個里程碑,其意義在于使組件編程化得以實現。COM技術最初的思想起源于將類做成可重用的二進制組件,把類的實現和接口分離以便把類的實現封裝到二進制防火墻的背后,而這道防火墻以VPTR和VTBL的形式保證了這個防火墻的不變性。.NET技術則在語言層面上支持了基于組件的程序設計。相對于COM技術,.NET技術就是為基于組件的程序設計而生的,所以其編碼效率和語言可讀性要高出COM一個等級。但是由于1993年以后的十多年時間里,人們利用基于COM的組件程序設計技術開發了大量的高復雜度,高可用性的代碼,并且他們運行良好,效率極高,如果用.NET技術重寫這些代碼簡直就是得不償失,加之在.NET的實現過程中并不是所有的Windows API都被重寫,有些功能是.NET所不能完成的。面對這樣的問題, .NET互操作技術應運而生,可見需求才是技術的原動力。

.NET互操作技術主要分為3種,P/Invoke,C++ Interop,COM Interop,其中P/Invoke 主要用于調用C庫函數和Windows API。C++ Interop則主要用于Managed C++調用 C++類庫和核心算法庫,它甚至允許托管代碼和非托管代碼在同一個文件中。 COM Interop主要包括正向的RCW和反向的CCW。下面以一個簡單的例子對互操作中比較重要的數據封送進行簡單的介紹。

如何封送字符串(P/Invoke方式)

假設非托管代碼定義如下:

  1. void _cdecl stringMarshal( const wchar_t* inString,  wchar_t* outString, int buffersize)  
  2. {  
  3.     If(NULL != inString)  
  4. {  
  5.     wcscpy_s(outString, buffersize, inString);  
  6. }  

這段代碼編譯生成的文件名為:stringMarshal.dll

在托管代碼中其托管定義如下:

  1. [DllImport  
  2. (“stringMarshal.dll”,  
  3. CharSetCharSet = CharSet.Unicode,  
  4. CallingConventionCallingConvention =CallingConvention.Cdecl)  
  5. ]  
  6. public extern static void stringMarshal (string inString, StringBuilder outString, int bufferSize); 

 

這里有幾點需要注意:

1.  在聲明函數時必須要用extern修飾符,目的是為了告訴編譯器此函數是外部實現的,沒有方法體,因此不需要在托管代碼中搜索這個函數。

2.  在聲明函數時必須要用static修飾符,原因是非托管的DLL導出的非托管方法都是可以直接調用的,無需對相關的類進行實例化,大部分情況下根本就不存在類。

3. 因為非托管代碼中的字符串為wchar_t*類型,所以CharSet需要設置為CharSet.Unicode。

4. 因為非托管代碼的調用方式為_cdecl, 所以托管部分的CallingConvention需要設置為CallingConvention.Cdecl,另外這種類型的調用方式是調用方負責處理堆棧,所以支持可變類型參數函數例如printf()的互操作。

5. 輸入字符串需要封裝為string是因為這個字符串屬于固定字符串,互操作過程中不需要變化,而輸出字符串則需要封裝為StringBuilder,因為這種字符串默認為具有IN/OUT屬性,其內容可變,而且當字符串經常需要變化時效率高。

托管代碼中調用非托管代碼方式如下:

  1. private static void TestStringMarshal ()  
  2.  {  
  3.     string inString = "Wally input test string.";  
  4.     int bufferSize = inString.Length;  
  5.     StringBuilder strbd = new StringBuilder(bufferSize);  
  6.     stringMarshal (inString, strbd, bufferSize + 1);  
  7.     Console.WriteLine("Wally Input string: {0}", inString);  
  8.     Console.WriteLine("Wally output string: {0}", strbd.ToString());  

總結

本文簡要的介紹了.NET托管代碼和本地非托管代碼的互操作技術,并對數據封送的實現細節做了簡單的說明,希望對大家的技術提高有所幫助,算是拋磚引玉,期待大家在這方面寫出更多更好的文章。

 

責任編輯:彭凡 來源: 博客園
相關推薦

2009-02-04 17:11:28

JavaFXJava兼容性

2009-04-02 15:21:43

c#IDisposeFinalize

2009-10-26 09:04:08

Java和.NET互操Web Service

2010-01-06 18:27:06

.Net Framew

2013-08-19 17:25:18

.Net托管

2010-08-13 11:10:07

Flex.NETWebService

2022-02-28 00:30:37

NFT游戲技術

2010-03-17 12:32:07

ASP.NETjQuery開源社區

2009-08-03 14:36:08

c#組件

2020-08-13 17:25:43

區塊鏈金融科技稅務發票

2013-05-28 10:09:10

SPB技術SPB網絡

2009-11-02 11:27:42

VB.NET二進制文件

2011-07-20 14:04:42

.NET策略模式

2014-10-13 15:17:59

代碼托管

2013-08-02 13:32:29

開源代碼代碼托管開源

2018-12-19 09:21:39

數據中心行業運營

2009-10-26 17:07:17

VB.NET UNDO

2009-06-15 20:07:03

ibmdwWebSphere.NET

2009-07-24 10:52:42

ASP.NET ISA

2023-12-27 14:50:10

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区中文字幕 | 午夜看看 | 国产亚洲精品区 | aaaaa毛片| 欧美性乱 | 99在线资源| 日韩电影在线一区 | www.久久 | 国产高清精品一区二区三区 | 久草网址| 亚洲国产精品久久久久秋霞不卡 | 一道本不卡 | 中文字幕视频在线观看 | 日日骚视频 | 国产日韩精品在线 | 久久精品国产一区二区电影 | yiren22 亚洲综合| 香蕉久久a毛片 | 欧美性生活视频 | 性色在线 | 欧美精品在线播放 | 日韩免费一区二区 | 国产精品美女久久久av超清 | 国产精品久久久久久久三级 | 中文在线一区二区 | 久久久成人一区二区免费影院 | 久久久黑人 | 国产精品视频一二三区 | 精品美女视频在免费观看 | 91视频网址| 成人欧美一区二区三区黑人孕妇 | 久久久久久天堂 | 亚洲视频欧美视频 | 欧美在线观看一区 | 高清视频一区二区三区 | 91精品国产综合久久婷婷香蕉 | 久久国内 | 成人免费视频网站在线看 | av电影一区二区 | 久久久蜜桃 | www国产亚洲精品 |