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

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

導(dǎo)航

常用鏈接

留言簿(1)

隨筆分類(lèi)

隨筆檔案(4)

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

 
被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)用相對(duì)是簡(jiǎn)單的,而有些數(shù)據(jù)類(lèi)型則必須通過(guò)MarshalAs來(lái)做托管類(lèi)型的轉(zhuǎn)換,如:

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

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

[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)用基本是沒(méi)有問(wèn)題,重點(diǎn)在于數(shù)據(jù)類(lèi)型的轉(zhuǎn)換。多試過(guò)幾次了就不問(wèn)題了。

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

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

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

下面是 C# 調(diào)用 Win32 MessageBox 函數(shù)的示例:
  
using System;
using System.Runtime.InteropServices;
class MainApp
{

     //通過(guò)DllImport引用user32.dll類(lèi)。MessageBox來(lái)自于user32.dll類(lèi)
 [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(yǔ)言幾乎都用到了抽象類(lèi)這一概念,抽象類(lèi)為實(shí)現(xiàn)抽象事物提供了更大的靈活性。C#也不例外, C#通過(guò)覆蓋虛接口的技術(shù)深化了抽象類(lèi)的應(yīng)用。欲了解這方面的知識(shí),請(qǐng)看下一節(jié)-覆蓋虛接口

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


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


以上簡(jiǎn)單3行代碼,聲明一個(gè)add的方法, 輸入?yún)?shù)是兩個(gè)int參數(shù),返回這兩個(gè)數(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

確信有以上輸出, 說(shuō)明編譯成功生成了動(dòng)態(tài)庫(kù).

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

public class InvokeDll {
[DllImport("MyLib.dll", CharSet=CharSet.Auto)]
static extern int add(int a,int b);//聲明外部的標(biāo)準(zhǔn)動(dòng)態(tài)庫(kù), 跟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)動(dòng)態(tài)庫(kù)的全過(guò)程, 本來(lái)覺(jué)得很簡(jiǎn)單的東西, 一直都沒(méi)有想寫(xiě), 碰巧今日遇一朋友問(wèn)及此事, 就順便寫(xiě)了下來(lái).

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


只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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>
            亚洲乱码精品一二三四区日韩在线 | 在线播放豆国产99亚洲| 欧美日韩激情网| 欧美电影在线| 国产精品成人免费| 国产精品香蕉在线观看| 国产啪精品视频| 一区二区三区自拍| 91久久线看在观草草青青| 99热在这里有精品免费| 亚洲欧美激情四射在线日 | 一本色道久久综合亚洲精品高清| av成人毛片| 亚洲欧洲av一区二区| 久久精品亚洲乱码伦伦中文| 久久综合伊人77777蜜臀| 亚洲国产欧美一区二区三区久久 | 国产欧美日韩精品a在线观看| 国产欧美日韩激情| 亚洲激精日韩激精欧美精品| 日韩视频久久| 性色一区二区| 亚洲日本欧美| 久久精品国产精品| 欧美揉bbbbb揉bbbbb| 国内揄拍国内精品久久| 99精品国产在热久久下载| 欧美日韩国产欧| 国产精品午夜国产小视频| 亚洲国产精品第一区二区| 午夜精品久久久久| 亚洲黑丝一区二区| 久久精品国产99精品国产亚洲性色| 欧美日韩视频免费播放| 在线不卡中文字幕| 欧美一级在线视频| 亚洲精品免费一区二区三区| 久久精品91久久久久久再现| 欧美偷拍一区二区| 亚洲精品乱码久久久久久蜜桃91| 久久精品亚洲一区二区三区浴池| 99精品视频一区| 欧美高清视频www夜色资源网| 国内精品视频一区| 欧美一区国产在线| 日韩午夜av| 欧美黄色视屏| 亚洲美女免费精品视频在线观看| 玖玖玖免费嫩草在线影院一区| 亚洲伊人久久综合| 欧美午夜精品理论片a级按摩| 亚洲精选在线观看| 亚洲黄色有码视频| 老司机精品视频网站| 激情成人综合网| 久久精品国产欧美亚洲人人爽| 亚洲一区不卡| 国产精品永久免费在线| 欧美一区二区成人6969| 亚洲视频第一页| 国产精品萝li| 欧美专区在线| 久久精品视频在线看| 黄色日韩网站视频| 狂野欧美激情性xxxx欧美| 久久激情五月激情| 在线成人激情| 欧美激情一区在线观看| 欧美国产日韩精品| 亚洲小视频在线观看| 中文欧美在线视频| 国产亚洲精品美女| 久久综合狠狠综合久久激情| 久久久久久久综合色一本| 一区在线观看视频| 亚洲国语精品自产拍在线观看| 欧美激情免费观看| 一区二区三区四区国产| 一区二区三区高清不卡| 国产酒店精品激情| 美女在线一区二区| 欧美精品电影| 性感少妇一区| 久久aⅴ国产欧美74aaa| 在线精品视频一区二区| 亚洲日本电影| 国产日韩一区在线| 亚洲第一精品福利| 午夜在线电影亚洲一区| 一区二区三区在线不卡| 亚洲国产视频一区| 欧美视频日韩视频| 久久亚洲精品伦理| 欧美日本国产一区| 久久精品国产清自在天天线| 欧美国产大片| 欧美在线一二三四区| 欧美www在线| 久久精品中文字幕免费mv| 欧美激情在线观看| 久久综合五月| 国产精品免费看| 亚洲国产你懂的| 激情久久一区| 亚洲午夜免费福利视频| 亚洲日韩欧美视频| 欧美一区三区二区在线观看| 一区二区三区.www| 男人的天堂成人在线| 久久精品夜色噜噜亚洲a∨ | 黄色另类av| 国产精品99久久久久久宅男| 91久久综合| 久久亚洲欧美国产精品乐播| 亚洲免费网站| 欧美另类videos死尸| 免费观看成人www动漫视频| 国产精品五区| 一区二区三区 在线观看视| 日韩视频在线观看国产| 久久美女艺术照精彩视频福利播放| 欧美亚洲视频一区二区| 欧美日韩综合不卡| 亚洲乱码日产精品bd| 亚洲精品国产精品乱码不99按摩| 久久不射中文字幕| 久久久久久黄| 国产中文一区二区| 亚洲欧美日韩国产成人| 亚洲欧美久久久| 国产精品视频99| 国产精品99久久久久久www| 亚洲午夜性刺激影院| 欧美日韩国产影院| 日韩亚洲成人av在线| 一本色道久久综合亚洲精品小说 | 久久亚洲欧洲| 国产一区91| 久久久国产一区二区| 久久久久一区二区三区四区| 国产一区二区三区黄| 欧美一区二区三区免费大片| 久久先锋资源| 亚洲韩日在线| 欧美美女福利视频| 一区二区高清在线观看| 欧美精品一区二区三区久久久竹菊 | av成人免费| 蜜桃av综合| 久久久噜噜噜久噜久久| 久久精品国产999大香线蕉| 一区二区三区在线免费播放| 亚洲午夜在线观看| 99re66热这里只有精品3直播| 亚洲免费一级电影| 欧美日本不卡视频| 99精品国产高清一区二区| 中文精品一区二区三区| 欧美日韩国语| 亚洲欧美日韩精品| 久久久久久电影| 亚洲人成7777| 欧美视频在线观看| 亚洲欧美日韩一区二区| 久久免费视频观看| 亚洲激情欧美| 欧美精品1区| 亚洲性图久久| 欧美电影免费观看大全| 亚洲视频欧美视频| 黄色亚洲网站| 欧美啪啪一区| 欧美在线视频免费观看| 亚洲国产精品激情在线观看| 亚洲一区精品电影| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 欧美片在线观看| 亚洲免费视频网站| 蜜臀av性久久久久蜜臀aⅴ四虎 | 一区二区免费在线视频| 国产精品一区一区| 免费观看一级特黄欧美大片| 中文高清一区| 亚洲国产美女精品久久久久∴| 午夜在线成人av| 亚洲精品小视频| 国内视频精品| 国产精品久久久久久户外露出| 久久综合中文字幕| 亚洲欧美日韩一区二区在线| 亚洲日本成人| 亚洲国产成人精品久久久国产成人一区 | 国产日韩欧美麻豆| 欧美国内亚洲| 久久免费视频在线| 香港成人在线视频| 一区二区激情视频| 亚洲第一久久影院| 久久综合婷婷| 久久久久久久一区|