日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

C#學(xué)習(xí)點(diǎn)點(diǎn)滴滴 C#調(diào)用C

 ThinkTank_引擎 2015-07-24

由于歷史原因,很多時(shí)候我們的代碼并不完全是使用.NET寫(xiě)成的。這時(shí)候和以往C++代碼的混合編程就顯得相當(dāng)重要了。最近碰到了這樣的問(wèn)題,將方法簡(jiǎn)要記述如下。

調(diào)用簡(jiǎn)單的C++函數(shù)

要在C#代碼中調(diào)用C++函數(shù),大體的思路是這樣的:首先將C++函數(shù)寫(xiě)成DLL形式的庫(kù),然后在C#中導(dǎo)入DLL中的函數(shù)進(jìn)行調(diào)用。具體的代碼類(lèi)似這樣:
C++代碼:

1 int StaticElementNumber = 10;
2  extern "C" AFX_API_EXPORT int GetArrayElementNumber()
3 {
4 return StaticElementNumber;
5 }

C#代碼:
(導(dǎo)入函數(shù)部分,寫(xiě)在調(diào)用函數(shù)所在類(lèi)中)

1 [DllImport("MFCDll.dll")]
2  public static extern int GetArrayElementNumber();
3  int ElementNumber = GetArrayElementNumber();

s其中的細(xì)節(jié),比如int和char等數(shù)據(jù)類(lèi)型在C++和C#中占用的空間不同等等CLR會(huì)自動(dòng)處理。(主要是通過(guò)Marshal類(lèi)自動(dòng)處理)

這樣的調(diào)用還支持調(diào)試。打開(kāi)C#工程的Properties,在Debug選項(xiàng)卡中勾選Enable unmanaged code debugging即可啟用C++代碼調(diào)試。這樣在調(diào)試模式下,調(diào)用這個(gè)函數(shù)時(shí)可以繼續(xù)按F11跟進(jìn)函數(shù)內(nèi)部進(jìn)行調(diào)試。

傳遞GDI對(duì)象

一些復(fù)雜的Windows對(duì)象可以通過(guò)句柄來(lái)傳送。比如下面的代碼就將一個(gè)GDI+ Bitmap對(duì)象轉(zhuǎn)換成GDI句柄進(jìn)行傳送。
C++代碼(GDI+的聲明,引用等等省略):

復(fù)制代碼
1 extern "C" AFX_API_EXPORT HBITMAP GetABitmap(WCHAR *strFileName)
2 {
3 Gdiplus::GdiplusStartupInput gdiplusStartupInput;
4 ULONG_PTR gdiplusToken;
5 GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
6 Bitmap *bitmap = Bitmap::FromFile(strFileName);
7 HBITMAP HBitmapToReturn;
8 bitmap->GetHBITMAP(NULL, &HBitmapToReturn);
9 GdiplusShutdown(gdiplusToken);
10
11 return HBitmapToReturn;
12 }
復(fù)制代碼

C#代碼(用戶(hù)界面采用WPF,略去相關(guān)聲明和引用):

復(fù)制代碼
1 [DllImport("MFCDll.dll")]
2  public static extern IntPtr GetABitmap([MarshalAs(UnmanagedType.LPWStr)] string strFileName);
3
4  private void MenuItemFileOpenOnClicked(object sender, RoutedEventArgs e)
5 {
6 OpenFileDialog dialog = new OpenFileDialog();
7 dialog.Title = "Load an image...";
8 dialog.Multiselect = false;
9 if (dialog.ShowDialog() == true)
10 {
11 mainGrid.Children.Clear();
12
13 IntPtr hBitmap = GetABitmap(dialog.FileName);
14 Bitmap bitmap = Bitmap.FromHbitmap(hBitmap);
15 System.Windows.Controls.Image image = new Windows.Controls.Image();
16 image.Source = Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, ro, Int32Rect.Empty,
17 Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
18 image.Stretch = System.Windows.Media.Stretch.Fill;
19 DeleteObject(hBitmap);
20 mainGrid.Children.Add(image);
21 }
22 }
復(fù)制代碼

 

 

 

傳遞數(shù)組

傳遞定長(zhǎng)數(shù)組很簡(jiǎn)單,此處不述。下面的代碼實(shí)現(xiàn)變長(zhǎng)數(shù)組的傳遞:
C++代碼:

復(fù)制代碼
1 int StaticElementNumber = 10;
2 extern "C" AFX_API_EXPORT bool GetArray(int ElementNumber, double *BaseAddress)
3 {
4 if (ElementNumber < StaticElementNumber)
5 {
6 return false;
7 }
8
9 for (int i = 0; i < StaticElementNumber; ++i)
10 {
11 BaseAddress[i] = 1 / ((double)i + 1);
12 }
13
14 return true;
15 }
16
17 extern "C" AFX_API_EXPORT int GetArrayElementNumber()
18 {
19 return StaticElementNumber;
20 }
復(fù)制代碼

 

 

C#代碼:  

復(fù)制代碼
1 [DllImport("MFCDll.dll")]
2 public static extern bool GetArray(int ElementNumber, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] double[] BaseAddress);
3
4 private void MenuItemFileGetArrayOnClicked(object sender, RoutedEventArgs e)
5 {
6 //Get array data.
7 int ElementNumber = GetArrayElementNumber();
8 double[] doubleArray = new double[ElementNumber];
9 GetArray(ElementNumber, doubleArray);
10
11 //Show the data.
12 mainGrid.Children.Clear();
13 ListBox listBox = new ListBox();
14 foreach (double number in doubleArray)
15 {
16 listBox.Items.Add(number);
17 }
18 mainGrid.Children.Add(listBox);
19 }
20
復(fù)制代碼

有了這三個(gè)功能,一般來(lái)說(shuō)C++代碼復(fù)用到C#平臺(tái)上就是比較簡(jiǎn)單的事情了。

http://www.cnblogs.com/grapeot/archive/2010/01/25/1656240.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多