亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C#調用C++DLL

2019-11-08 01:26:23
字體:
來源:轉載
供稿:網友

   在合作開發時,C#時常需要調用C++DLL。研究了一下C#,發現其強大簡潔, 在跨語言調用方面封裝的很徹底,提供了強大的API與之交互.這點比JNA方便多了. java與C#都只能調用C格式導出動態庫,因為C數據類型比較單一,容易映射. 兩者都是在本地端提供一套與之映射的C#/java描述接口,通過底層處理這種映射關系達到調用的目的.

1、調用例子(例子中提供了傳值調用和傳址調用兩種方法):

C++代碼(C++生成動態庫DLL.dll):

Lib.h

//文件:lib.h#PRagma once#include <string> using namespace std;  #define JNAAPI extern "C" __declspec(dllexport) // C方式導出函數typedef struct CARDINFO{	int majorVersion;	int minorVersion;	int cardType;	char szDescribe[128];};// 1. 獲取版本信息(傳遞結構體指針)    JNAAPI bool GetVersionPtr(CARDINFO *info);// 2.獲取版本信息(傳遞結構體引用)    JNAAPI bool GetVersionRef(CARDINFO &info);

Lib.cpp

#include "stdafx.h"#include "lib.h"#include <stdlib.h>using namespace std;// 1. 獲取版本信息(傳遞結構體指針)    bool GetVersionPtr(CARDINFO *info){	info->majorVersion = 1;	info->minorVersion = 22;	info->cardType = 3;	memcpy(info->szDescribe, "hello world", 128);	return true;}// 2.獲取版本信息(傳遞結構體引用)    bool GetVersionRef(CARDINFO &info){	info.majorVersion = 1;	info.minorVersion = 22;	info.cardType = 3;	memcpy(info.szDescribe, "hello world", 128);	return true;}

C#代碼(C++生成動態庫DLL.dll):

class CCommand{    const string dllpathfile = "..//..//..//..//Lib//DLL.dll";    // CARDINFO定義      [StructLayout(LayoutKind.Sequential)]    public struct CARDINFO    {        public int majorVersion;        public int minorVersion;        public int cardType;        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]        public string szDescribe;    }    [DllImport(dllpathfile, EntryPoint = "GetVersionPtr")]    public static extern bool GetVersionPtr(ref CARDINFO info);    [DllImport(dllpathfile, EntryPoint = "GetVersionRef")]    public static extern bool GetVersionRef(ref CARDINFO info);}	調用:

   //C#調用C++庫   CCommand.CARDINFO cardInfo = new CCommand.CARDINFO();   CCommand.GetVersionPtr(ref cardInfo);

2、類型轉換說明:

類型對照:

C++類型

C#類型

BSTR

StringBuilder

LPCTSTR

StringBuilder

LPCWSTR

IntPtr

handle

IntPtr

hwnd

IntPtr

char *

string

int *

ref int

int &

ref int

void *

IntPtr

unsigned char *

ref byte

CLR Type

Win32 Types

System.SByte

char, INT8, SBYTE, CHAR

System.Int16

short, short int, INT16, SHORT

System.Int32

int, long, long int, INT32, LONG32, BOOL , INT

System.Int64

__int64, INT64, LONGLONG

System.Byte

unsigned char, UINT8, UCHAR , BYTE

System.UInt16

unsigned short, UINT16, USHORT, Word, ATOM, WCHAR , __wchar_t

System.UInt32

unsigned, unsigned int,

UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT

System.UInt64

unsigned __int64,

UINT64, DWORDLONG, ULONGLONG

System.Single

float, FLOAT

System.Double

double, long double, DOUBLE

注:

C#中類型轉換接口:

將string轉為IntPtr:

IntPtrSystem.Runtime.InteropServices.Marshal.StringToCoTaskMemAuto(string)

 

將IntPtr轉為string:

stringSystem.Runtime.InteropServices.MarshalPtrToStringAuto(IntPtr)

3、代碼分析

C#為了用上C++的代碼,只好研究下從C# 中調用DLL,首先必須要有一個聲明,使用的是DllImport關鍵字,包含DllImport所在的名字空間

using System.Runtime.InteropServices;class CCommand{    conststringdllpathfile ="..//..//..//..//Lib//DLL.dll";    [DllImport(dllpathfile, EntryPoint ="GetVersionPtr")]    publicstaticexternboolGetVersionPtr(refCARDINFOinfo);}

DllImport關鍵字作用是告訴編譯器入口點在哪里,并將打包函數捆綁在這個類中,在類中,直接調用GetVersionPtr,在其他的類中調用CCommand.GetVersionPtr

[DllImport(dllpathfile)]在申明的時候還可以添加幾個屬性[DllImport(dllpathfile, EntryPoint="GetVersionPtr ",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]EntryPoint: 指定要調用的 DLL 入口點。默認入口點名稱是托管方法的名稱 。CharSet: 控制名稱重整和封送 String 參數的方式 (默認是UNICODE)CallingConvention指示入口點的函數調用約定(默認WINAPI) SetLastError 指示被調用方在從屬性化方法返回之前是否調用 SetLastError Win32 API 函數 (C#中默認false )


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人久久久久久| 亚洲精品一区中文字幕乱码| 国产精品久久久久久久久免费| 亚洲人永久免费| 日韩电影在线观看免费| 97在线视频免费播放| 国产精品视频自拍| 最近2019中文免费高清视频观看www99| 欧美最猛性xxxxx亚洲精品| 91在线观看欧美日韩| 欧美日韩国产丝袜美女| 欧美在线欧美在线| 国产成人a亚洲精品| 亚洲视频电影图片偷拍一区| 久久久久久美女| 97在线观看视频| 正在播放国产一区| 日av在线播放中文不卡| 91精品久久久久久久久久入口| 国产精品人人做人人爽| www.欧美免费| 日韩高清电影免费观看完整版| 亲爱的老师9免费观看全集电视剧| 欧美激情一区二区三区在线视频观看| 亚洲国产精品99久久| 国产精品久久久久久中文字| 亚洲午夜精品久久久久久性色| 国产精品草莓在线免费观看| 欧美区二区三区| 亚洲最大福利网站| 国产精品www色诱视频| 欧美二区乱c黑人| 日韩久久免费视频| 1769国内精品视频在线播放| 国产欧美欧洲在线观看| 日韩最新免费不卡| 亚洲精品ady| 伊人亚洲福利一区二区三区| 97视频免费在线看| 成人国产精品一区二区| 久久久爽爽爽美女图片| 中文字幕一区日韩电影| 91久久久国产精品| 在线播放日韩精品| 欧洲美女免费图片一区| 91超碰中文字幕久久精品| 亚洲第一页在线| 久久夜色精品国产亚洲aⅴ| 中文字幕日韩专区| 国产美女久久久| 一区二区成人av| 欧美午夜激情小视频| 国产日本欧美一区二区三区| 欧美在线激情视频| 91tv亚洲精品香蕉国产一区7ujn| 欧美多人乱p欧美4p久久| 国产精品久久久久久久久久免费| 国产精品va在线播放我和闺蜜| 精品久久久久久久久国产字幕| 午夜精品一区二区三区av| 久久久噜噜噜久久久| 久久亚洲一区二区三区四区五区高| 国产精品视频网站| 97精品久久久中文字幕免费| 欧美视频精品一区| 欧美亚洲另类激情另类| 精品久久久久国产| 精品久久久久国产| 1769国产精品| 日韩av在线网址| 国产欧美 在线欧美| 综合欧美国产视频二区| 国产中文字幕亚洲| 久久免费视频网| 亚洲成人亚洲激情| 伊人久久久久久久久久久久久| 在线看日韩欧美| 清纯唯美亚洲综合| 亚洲美女黄色片| 色在人av网站天堂精品| 深夜福利一区二区| 狠狠色香婷婷久久亚洲精品| 亚洲人精选亚洲人成在线| 日韩亚洲在线观看| 在线观看日韩www视频免费| 中文字幕一精品亚洲无线一区| 奇米成人av国产一区二区三区| 色婷婷av一区二区三区久久| 久久精品91久久香蕉加勒比| 超碰精品一区二区三区乱码| 国产精品女主播| 国产日韩欧美影视| 午夜精品久久久久久久99热| 亚洲视频在线播放| 亚洲第一视频在线观看| 欧美日韩激情小视频| www.欧美三级电影.com| 久久精品国产亚洲| 国产精品久久久久久影视| www.日韩av.com| 日韩欧中文字幕| 国外日韩电影在线观看| 九九精品视频在线观看| 亚洲影院污污.| 97碰碰碰免费色视频| 亚洲人成77777在线观看网| 亚洲桃花岛网站| 欧美激情中文字幕在线| 久久久久一本一区二区青青蜜月| 精品一区二区三区四区| 亚洲影院高清在线| 国产ts人妖一区二区三区| 亚洲精品久久视频| 性欧美激情精品| 成人在线免费观看视视频| 久久久国产影院| 亚洲国产精品资源| 中文字幕九色91在线| 国产一区视频在线播放| 成人性生交大片免费看视频直播| 欧美激情视频一区| 亚洲精品乱码久久久久久金桔影视| 久久久91精品国产| 亚洲热线99精品视频| 亚洲自拍av在线| 成人网在线免费观看| 国产成人+综合亚洲+天堂| 性视频1819p久久| 亚洲综合一区二区不卡| 热re91久久精品国99热蜜臀| 国产婷婷色综合av蜜臀av| 性欧美xxxx视频在线观看| 国产91av在线| 中文字幕日韩在线播放| 亚洲欧美一区二区三区久久| 亚洲国产精品久久久久秋霞蜜臀| 一区二区三欧美| 欧美日韩精品国产| 精品亚洲男同gayvideo网站| 欧美日韩亚洲网| 九色精品免费永久在线| 久久免费成人精品视频| 欧美日韩视频在线| 一区二区三区无码高清视频| 中文字幕国内精品| 欧美有码在线视频| 日韩欧美国产一区二区| 亚洲精品在线观看www| 精品亚洲男同gayvideo网站| 国产va免费精品高清在线观看| 日韩av成人在线观看| 亚洲aa中文字幕| 91久久久久久久久久| 亚洲视频一区二区| 国产精品www| 亚洲天堂视频在线观看| 丁香五六月婷婷久久激情| 国产精品久久久久久久9999| 91日本在线观看| 91国产在线精品| 欧美二区乱c黑人| 色综合亚洲精品激情狠狠| 色99之美女主播在线视频| 国产精品久久av|