乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      C#學習點點滴滴 C#調用C

       ThinkTank_引擎 2015-07-24

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

      調用簡單的C++函數(shù)

      要在C#代碼中調用C++函數(shù),大體的思路是這樣的:首先將C++函數(shù)寫成DLL形式的庫,然后在C#中導入DLL中的函數(shù)進行調用。具體的代碼類似這樣:
      C++代碼:

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

      C#代碼:
      (導入函數(shù)部分,寫在調用函數(shù)所在類中)

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

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

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

      傳遞GDI對象

      一些復雜的Windows對象可以通過句柄來傳送。比如下面的代碼就將一個GDI+ Bitmap對象轉換成GDI句柄進行傳送。
      C++代碼(GDI+的聲明,引用等等省略):

      復制代碼
      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 }
      復制代碼

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

      復制代碼
      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 }
      復制代碼

       

       

       

      傳遞數(shù)組

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

      復制代碼
      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 }
      復制代碼

       

       

      C#代碼:  

      復制代碼
      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
      復制代碼

      有了這三個功能,一般來說C++代碼復用到C#平臺上就是比較簡單的事情了。

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

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多