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

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

導(dǎo)航

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案(4)

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

 
被C#調(diào)用的DLL一般只需要把導(dǎo)出的函數(shù)以適當(dāng)?shù)男问匠尸F(xiàn)即可調(diào)用,比如
extern "C" __declspec(dllexport)
BOOL Integrate3 (){...},這樣的函數(shù),在C#里面聲明如:

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

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

由于數(shù)據(jù)類型不一致,所以在聲明時要注意把類型轉(zhuǎn)換過來。

[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);

這樣調(diào)用基本是沒有問題,重點在于數(shù)據(jù)類型的轉(zhuǎn)換。多試過幾次了就不問題了。

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

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

DllImport知識拓展:DllImport 
 .net 框架程序可以通過靜態(tài) DLL 入口點的方式來訪問本機代碼庫。DllImport 屬性用于指定包含外部方法的實現(xiàn)的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具有單個定位參數(shù):指定包含被導(dǎo)入方法的 dll 名稱的 dllName 參數(shù)。 
    3、DllImport具有五個命名參數(shù):
     a、CallingConvention 參數(shù)指示入口點的調(diào)用約定。如果未指定 CallingConvention,則使用默認(rèn)值 CallingConvention.Winapi。
     b、CharSet 參數(shù)指示用在入口點中的字符集。如果未指定 CharSet,則使用默認(rèn)值 CharSet.Auto。
   c、EntryPoint 參數(shù)給出 dll 中入口點的名稱。如果未指定 EntryPoint,則使用方法本身的名稱。
   d、ExactSpelling 參數(shù)指示 EntryPoint 是否必須與指示的入口點的拼寫完全匹配。如果未指定 ExactSpelling,則使用默認(rèn)值 false。
   e、PreserveSig 參數(shù)指示方法的簽名應(yīng)當(dāng)被保留還是被轉(zhuǎn)換。當(dāng)簽名被轉(zhuǎn)換時,它被轉(zhuǎn)換為一個具有 HRESULT 返回值和該返回值的一個名為 retval 的附加輸出參數(shù)的簽名。如果未指定    PreserveSig,則使用默認(rèn)值 true。
      f、SetLastError 參數(shù)指示方法是否保留 Win32"上一錯誤"。如果未指定 SetLastError,則使用默認(rèn)值 false。 
 4、它是一次性屬性類。
 5、此外,用 DllImport 屬性修飾的方法必須具有 extern 修飾符。

下面是 C# 調(diào)用 Win32 MessageBox 函數(shù)的示例:
  
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 );
 }
}
面向?qū)ο蟮木幊陶Z言幾乎都用到了抽象類這一概念,抽象類為實現(xiàn)抽象事物提供了更大的靈活性。C#也不例外, C#通過覆蓋虛接口的技術(shù)深化了抽象類的應(yīng)用。欲了解這方面的知識,請看下一節(jié)-覆蓋虛接口

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


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


以上簡單3行代碼,聲明一個add的方法, 輸入?yún)?shù)是兩個int參數(shù),返回這兩個數(shù)之和. 保存為MyLib.c
然后執(zhí)行編譯命令.
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

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

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

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

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

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


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


 
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>
            欧美精品1区2区| 午夜日韩av| 欧美四级在线观看| 欧美日韩一区二区三区在线视频 | 香蕉久久夜色精品国产| 亚洲无线一线二线三线区别av| 99精品久久久| 亚洲女同同性videoxma| 亚洲综合视频网| 久久久久亚洲综合| 欧美国产在线电影| 夜夜嗨一区二区三区| 亚洲一区二区三区乱码aⅴ| 欧美一区深夜视频| 两个人的视频www国产精品| 欧美另类综合| 国产美女精品人人做人人爽| 欲香欲色天天天综合和网| 日韩午夜电影| 久久国产天堂福利天堂| 欧美肥婆bbw| 亚洲视频一区| 每日更新成人在线视频| 国产精品久久久久久久久| 国产主播一区二区三区四区| 99精品视频免费全部在线| 久久精品成人一区二区三区| 欧美激情一区二区三区四区| 亚洲午夜av在线| 欧美激情精品久久久久久变态| 国产欧美日韩在线播放| 日韩亚洲欧美精品| 欧美1区视频| 亚洲一区二区三区免费视频| 麻豆精品在线视频| 狠色狠色综合久久| 亚洲主播在线| 亚洲精品你懂的| 亚洲精品人人| 免费看av成人| 黄色成人91| 欧美一区在线视频| aa亚洲婷婷| 欧美日韩伦理在线免费| 亚洲国内高清视频| 久久精品视频亚洲| 午夜精彩国产免费不卡不顿大片| 国产一区视频观看| 欧美专区18| 亚洲美女电影在线| 久久综合色8888| 亚洲男人影院| 国产精品尤物| 午夜精品电影| 一本久久a久久精品亚洲| 欧美1区2区| 亚洲国产91色在线| 免费一级欧美片在线观看| 久久九九99| 黄色成人在线免费| 久久精品亚洲一区| 亚洲天堂成人在线视频| 国产精品久久久对白| 9色精品在线| 99v久久综合狠狠综合久久| 欧美人与性动交α欧美精品济南到| 亚洲精品国产欧美| 亚洲精品美女免费| 欧美日韩理论| 亚洲欧美变态国产另类| 亚洲性图久久| 国产日韩欧美在线播放不卡| 亚洲免费在线精品一区| 亚洲综合色婷婷| 韩国三级电影久久久久久| 久久亚洲捆绑美女| 欧美好骚综合网| 亚洲一区二区视频| 亚洲一区二三| 亚洲二区在线视频| 亚洲欧洲三级| 国产精品porn| 久久乐国产精品| 免费日韩视频| 亚洲免费小视频| 久久久夜精品| 亚洲一级二级在线| 欧美在线视频在线播放完整版免费观看 | 久久久精品久久久久| 国内精品视频久久| 免费在线欧美视频| 欧美性做爰毛片| 久久伊人精品天天| 欧美日韩久久久久久| 久久久午夜电影| 欧美日韩1区2区| 久久精品亚洲乱码伦伦中文 | 亚洲一区三区电影在线观看| 欧美一区二区三区视频| 亚洲精品永久免费| 欧美一级播放| 亚洲婷婷综合色高清在线| 久久久精品动漫| 亚洲淫性视频| 亚洲三级性片| 国产亚洲精品高潮| 亚洲精品中文字幕在线观看| 国产欧美韩国高清| 亚洲人成网站精品片在线观看 | 性欧美1819性猛交| 亚洲另类春色国产| 久久爱www久久做| 一区二区三区四区五区视频| 久久精品一本| 久久国产精品一区二区三区四区| 欧美精选一区| 欧美国产精品劲爆| 国产精品自在欧美一区| 亚洲精品乱码久久久久久日本蜜臀 | 久久人人97超碰精品888| 欧美一区1区三区3区公司| 欧美高清视频一区二区三区在线观看| 久久国产精品99久久久久久老狼 | 欧美电影专区| 欧美.com| 在线精品国产欧美| 午夜日韩在线观看| 欧美与欧洲交xxxx免费观看 | 亚洲免费成人av| 亚洲最新在线| 欧美成人免费网| 欧美成人午夜77777| 极品日韩久久| 欧美亚洲一区二区在线观看| 欧美在线一二三区| 国产一区二区电影在线观看| 制服丝袜激情欧洲亚洲| 亚洲欧美日韩国产综合精品二区 | 亚洲国产成人精品久久| 久久久久久久999精品视频| 久久精品一区| 国产在线视频欧美| 久久精品99| 嫩草成人www欧美| 一区久久精品| 欧美国产精品v| 日韩视频永久免费观看| 亚洲视频电影图片偷拍一区| 欧美日韩亚洲在线| 亚洲一区观看| 欧美在线免费看| 伊人伊人伊人久久| 欧美国产三区| 在线亚洲伦理| 久久午夜电影网| 最新日韩在线| 欧美视频一区在线观看| 亚洲主播在线| 麻豆av一区二区三区久久| 亚洲欧洲精品一区二区三区不卡 | 亚洲一区二区网站| 欧美一区二区三区婷婷月色 | 看欧美日韩国产| 亚洲日本电影| 国产精品久久久久一区二区| 欧美一区二区三区在线观看视频| 美日韩在线观看| 99国内精品久久| 国产欧美亚洲一区| 欧美激情国产精品| 亚洲欧美日韩综合国产aⅴ| 男人的天堂亚洲在线| 一本色道久久加勒比精品| 国产精品一区在线观看| 久久影音先锋| 亚洲男女毛片无遮挡| 亚洲国产精品第一区二区| 亚洲欧美日本另类| 在线观看视频一区二区| 国产精品久久久久久久久久三级| 久久激情五月婷婷| 亚洲精品中文字| 欧美jjzz| 性做久久久久久| 亚洲视频999| 亚洲国产日韩欧美综合久久| 国产麻豆精品视频| 欧美日韩视频在线| 久久综合久色欧美综合狠狠 | 久久国产精品一区二区| 亚洲一区bb| 99精品热视频只有精品10| 在线播放亚洲| 国内精品伊人久久久久av影院 | 麻豆精品视频在线观看| 亚洲欧美激情精品一区二区| 亚洲人成7777| 亚洲高清不卡| 欧美77777| 快射av在线播放一区|