青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++-----勇者無敵  
流媒體、分布式實時系統、外掛、設計模式、C#
日歷
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011
統計
  • 隨筆 - 4
  • 文章 - 0
  • 評論 - 1
  • 引用 - 0

導航

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案(4)

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 
被C#調用的DLL一般只需要把導出的函數以適當的形式呈現即可調用,比如
extern "C" __declspec(dllexport)
BOOL Integrate3 (){...},這樣的函數,在C#里面聲明如:

[DllImport("xxx.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern bool Integrate3();,這里的調用相對是簡單的,而有些數據類型則必須通過MarshalAs來做托管類型的轉換,如:

extern "C" __declspec(dllexport)
BOOL Integrate (LPCWSTR file1, LPCWSTR file2, LPCWSTR outputFile){...}

由于數據類型不一致,所以在聲明時要注意把類型轉換過來。

[DllImport("xxx.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern bool Integrate([In, MarshalAs(UnmanagedType.LPWStr)]string file1,
            [In, MarshalAs(UnmanagedType.LPWStr)]string file2, [In, MarshalAs(UnmanagedType.LPWStr)]string outputFile);

這樣調用基本是沒有問題,重點在于數據類型的轉換。多試過幾次了就不問題了。

另外一個小小的實踐經驗就是在C#中調試C++的DLL,知道了就是一句話,不知道就要搞半天,在C#項目屬性中“啟用調試項”中一項:“啟用非托管代碼調試”,鉤上這個,就萬事大吉了,就像你調試一般的程序一樣。

C#調用C++的DLL時,參數傳遞便成了一個問題。今天我碰到的一個問題是,在C++中導出的函數的參數是string類型的,在C#中通過string的參數調用時,便會出現該內存已損壞或不能讀取的異常信息。后來我把C++的導出函數的參數由string改為LPTSTR類型,也即char*類型,然后在C#中對應的參數改為StringBuilder類型,既解決了傳進去的參數問題,又解決了傳出參數的問題。

DllImport知識拓展:DllImport 
 .net 框架程序可以通過靜態 DLL 入口點的方式來訪問本機代碼庫。DllImport 屬性用于指定包含外部方法的實現的dll 位置。

DllImport 屬性定義如下:
  
namespace System.Runtime.InteropServices
{
 [AttributeUsage(AttributeTargets.Method)]
 public class DllImportAttribute: System.Attribute
 {
  public DllImportAttribute(string dllName) {...}
  public CallingConvention CallingConvention;
  public CharSet CharSet;
  public string EntryPoint;
  public bool ExactSpelling;
  public bool PreserveSig;
  public bool SetLastError;
  public string Value { get {...} }
 }
}
  
  說明:
  
 1、DllImport只能放置在方法聲明上。 
    2、DllImport具有單個定位參數:指定包含被導入方法的 dll 名稱的 dllName 參數。 
    3、DllImport具有五個命名參數:
     a、CallingConvention 參數指示入口點的調用約定。如果未指定 CallingConvention,則使用默認值 CallingConvention.Winapi。
     b、CharSet 參數指示用在入口點中的字符集。如果未指定 CharSet,則使用默認值 CharSet.Auto。
   c、EntryPoint 參數給出 dll 中入口點的名稱。如果未指定 EntryPoint,則使用方法本身的名稱。
   d、ExactSpelling 參數指示 EntryPoint 是否必須與指示的入口點的拼寫完全匹配。如果未指定 ExactSpelling,則使用默認值 false。
   e、PreserveSig 參數指示方法的簽名應當被保留還是被轉換。當簽名被轉換時,它被轉換為一個具有 HRESULT 返回值和該返回值的一個名為 retval 的附加輸出參數的簽名。如果未指定    PreserveSig,則使用默認值 true。
      f、SetLastError 參數指示方法是否保留 Win32"上一錯誤"。如果未指定 SetLastError,則使用默認值 false。 
 4、它是一次性屬性類。
 5、此外,用 DllImport 屬性修飾的方法必須具有 extern 修飾符。

下面是 C# 調用 Win32 MessageBox 函數的示例:
  
using System;
using System.Runtime.InteropServices;
class MainApp
{

     //通過DllImport引用user32.dll類。MessageBox來自于user32.dll類
 [DllImport("user32.dll", EntryPoint="MessageBox")]
 public static extern int MessageBox(int hWnd, String strMessage, String strCaption, uint uiType);
 public static void Main()
 {
  MessageBox( 0, "您好,這是 PInvoke!", ".net", 0 );
 }
}
面向對象的編程語言幾乎都用到了抽象類這一概念,抽象類為實現抽象事物提供了更大的靈活性。C#也不例外, C#通過覆蓋虛接口的技術深化了抽象類的應用。欲了解這方面的知識,請看下一節-覆蓋虛接口

這里講述的是C#調用標準動態庫的問題, 在我以前的文件中講到過, C#調用Win32API, 原理是一樣的. 這里我詳細講解用C寫一個標準的動態庫, 然后讓C#調用. (本篇適合初學者, 中間沒有任何冗余代碼, 簡潔明了)
軟件環境: VC6.0(當然其他版本的VC5也可以)
1.制作標準動態庫


__declspec(dllexport) int __cdecl add(int, int);//這一句是聲明動態庫輸出一個可供外不調用的函數原型.
int add(int a,int b) {//實現這個函數
return a+b;
}


以上簡單3行代碼,聲明一個add的方法, 輸入參數是兩個int參數,返回這兩個數之和. 保存為MyLib.c
然后執行編譯命令.
H:\XSchool\C#-School\HowTo>cl /LD MyLib.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

MyLib.c
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:MyLib.dll
/dll
/implib:MyLib.lib
MyLib.obj
   Creating library MyLib.lib and object MyLib.exp

確信有以上輸出, 說明編譯成功生成了動態庫.

2.編寫C-Sharp程序調用該動態庫
using System;
using System.Runtime.InteropServices;//這是用到DllImport時候要引入的包

public class InvokeDll {
[DllImport("MyLib.dll", CharSet=CharSet.Auto)]
static extern int add(int a,int b);//聲明外部的標準動態庫, 跟Win32API是一樣的.

public static void Main() {
Console.WriteLine(add(10,30));
}
}
保存為InvokeDll.cs文件, 與MyLib.dll置于同一目錄, 編譯該文件.
H:\XSchool\C#-School\HowTo>csc invokedll.cs
將生成Invokedll.exe, 可以執行該文件.
以上是C-Sharp調用標準動態庫的全過程, 本來覺得很簡單的東西, 一直都沒有想寫, 碰巧今日遇一朋友問及此事, 就順便寫了下來.

posted on 2008-07-30 16:54 李明坤 閱讀(6297) 評論(1)  編輯 收藏 引用
評論:
  • # re: C#中調試C++的DLL[未登錄]  haha Posted @ 2015-06-24 11:53
    你好,我也遇到C#調用C++DLL的情況,但是有所不同的是,我引用的這個C++DLL又引用了另外一個C++DLL,我可以調試跟到第一層C++DLL,卻無法調試跟到第二個C++DLL,不知這個問題怎么解決,求教一下  回復  更多評論   

 
Copyright © 李明坤 Powered by: 博客園 模板提供:滬江博客
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜在线一区二区| 欧美日韩另类视频| 欧美大片在线影院| 久久视频精品在线| 免费成人毛片| 91久久精品国产91久久| 久久麻豆一区二区| 蜜臀av在线播放一区二区三区| 久久亚洲精品一区二区| 欧美高清免费| 一区二区欧美日韩| 欧美高清视频一区| 欧美激情在线免费观看| 日韩午夜中文字幕| 午夜视频久久久久久| 久久精品视频免费播放| 老司机aⅴ在线精品导航| 欧美精品激情在线观看| 国产欧美日韩综合一区在线播放 | 欧美不卡一卡二卡免费版| 欧美电影资源| 亚洲小说区图片区| 久久免费精品视频| 欧美大片在线观看一区二区| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲欧美日韩一区二区三区在线观看| 欧美激情视频在线免费观看 欧美视频免费一 | 午夜精品国产精品大乳美女| 亚洲午夜国产成人av电影男同| 欧美一区二区三区另类| 欧美国产专区| 国产综合久久久久久鬼色| 一区二区免费在线观看| 久久伊人一区二区| 中文日韩在线| 欧美高清视频| 精品盗摄一区二区三区| 亚洲欧美日韩在线播放| 亚洲无人区一区| 欧美一区亚洲二区| 欧美日韩午夜视频在线观看| 在线不卡免费欧美| 欧美一区高清| 一本色道88久久加勒比精品| 免播放器亚洲| 精品二区视频| 欧美在线视频免费播放| 国产精品99久久久久久www| 乱码第一页成人| 国产亚洲综合在线| 午夜欧美精品| 艳妇臀荡乳欲伦亚洲一区| 欧美激情在线| 亚洲国产视频直播| 葵司免费一区二区三区四区五区| 亚洲欧洲99久久| 国产视频在线一区二区| 欧美日本不卡高清| 久久久久九九视频| 国产精品免费网站| 亚洲伊人网站| 99热在这里有精品免费| 嫩草国产精品入口| 在线观看91久久久久久| 久久综合网络一区二区| 欧美一级艳片视频免费观看| 国产欧美日韩精品在线| 久久精品国产一区二区电影| 亚洲欧美一区二区原创| 国产精品一区二区视频| 欧美日韩国产一区| 亚洲一区二区精品在线观看| 亚洲午夜视频在线| 国产偷自视频区视频一区二区| 久久精品中文字幕一区| 久久久999精品| 亚洲精选91| 一区二区欧美在线| 国产午夜精品麻豆| 欧美暴力喷水在线| 欧美日韩一区二区三| 欧美影院一区| 亚洲视频网在线直播| 亚洲系列中文字幕| 黄色另类av| 亚洲精品一品区二品区三品区| 国产精品久久久久一区| 另类春色校园亚洲| 欧美精品久久久久久久| 欧美亚洲一区在线| 另类专区欧美制服同性| 一区二区三区日韩| 久久国产加勒比精品无码| 亚洲卡通欧美制服中文| 亚洲一区国产精品| 亚洲高清一区二| 亚洲一二三区在线| 亚洲国产小视频在线观看| 妖精视频成人观看www| 在线成人av网站| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 久久国产精品黑丝| 欧美精品999| 久久青青草原一区二区| 欧美色欧美亚洲高清在线视频| 久久一区二区视频| 欧美日韩一二三区| 蜜臀av一级做a爰片久久| 国产精品入口夜色视频大尺度| 欧美成人精品三级在线观看| 国产九区一区在线| 亚洲免费福利视频| 亚洲高清三级视频| 久久精品亚洲一区二区三区浴池| 亚洲午夜一二三区视频| 欧美激情成人在线| 免费日本视频一区| 国产视频综合在线| 亚洲欧美国产毛片在线| 亚洲神马久久| 欧美日韩精品在线视频| 亚洲国产婷婷综合在线精品 | 欧美精品成人一区二区在线观看| 久久一区二区三区四区五区| 国产精品综合av一区二区国产馆| 一区二区三区av| 一本色道久久88亚洲综合88| 蜜桃av噜噜一区| 欧美 日韩 国产精品免费观看| 欧美亚洲一区| 亚洲欧美日韩成人高清在线一区| 欧美精品激情| 亚洲蜜桃精久久久久久久 | 欧美a级片网站| 好看不卡的中文字幕| 欧美一区二区三区在线观看| 欧美一区国产二区| 国产亚洲精品一区二区| 欧美一乱一性一交一视频| 久久国产精品99国产| 国产精品夜夜嗨| 先锋资源久久| 久久永久免费| 亚洲人精品午夜| 欧美日韩精品一区二区| 在线视频中文亚洲| 久久gogo国模裸体人体| 国产一区二区三区四区五区美女| 欧美亚洲日本国产| 麻豆精品视频在线观看视频| 亚洲国产精品久久久久秋霞不卡| 蜜桃久久av一区| 亚洲精品视频在线观看网站| 亚洲在线播放| 韩国精品在线观看| 欧美插天视频在线播放| 日韩视频―中文字幕| 午夜精品免费| 伊人久久亚洲影院| 欧美激情中文字幕一区二区| 在线天堂一区av电影| 久久一区中文字幕| 亚洲毛片视频| 国产欧美精品| 欧美福利一区| 亚洲在线观看免费视频| 免费在线观看成人av| 9久草视频在线视频精品| 国产精品国产三级国产专播精品人 | 亚洲福利在线视频| 欧美日韩一区二区视频在线| 亚洲男女毛片无遮挡| 免费在线亚洲| 亚洲欧美日韩一区在线观看| 亚洲电影成人| 国产精品美女诱惑| 裸体素人女欧美日韩| 亚洲天堂黄色| 亚洲福利视频专区| 久久av资源网站| 亚洲一区二区三区精品在线观看| 黄色综合网站| 国产精品夜夜夜一区二区三区尤| 麻豆成人精品| 久久国产精品网站| 亚洲一区黄色| 99精品欧美一区二区三区综合在线| 久久久免费精品视频| 亚洲综合精品| 99精品视频免费全部在线| 好吊色欧美一区二区三区四区| 国产精品国色综合久久| 欧美激情精品久久久久久免费印度 | 在线不卡a资源高清| 国产精品久久中文| 欧美日韩国产成人| 欧美va亚洲va国产综合| 欧美在线视频a| 一本久久综合亚洲鲁鲁五月天 | 亚洲午夜在线视频|