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

首頁 > 學院 > 開發設計 > 正文

C#調用C++Dll

2019-11-14 14:05:56
字體:
來源:轉載
供稿:網友

現在項目基本都是旁邊C++的哥們做好dll扔給我,然后我調用。好久之前晚上down了一份c#調用c++dll的方法,出處早已經遺忘。閑來無事,放上來好了。原作者看到后可以留言,我會把您鏈接放上的,幫了我很多?。?!

  1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Reflection;  5 using System.Reflection.Emit;  6 using System.Runtime.InteropServices;  7 using System.Text;  8   9 namespace TEDS_App 10 { 11     public enum ModePass 12     { 13         ByValue = 0x0001, 14         ByRef = 0x0002 15     } 16     public class FaultFunc 17     { 18         [DllImport("kernel32.dll")] 19         static extern IntPtr LoadLibrary(string lpFileName); 20         [DllImport("kernel32.dll")] 21         static extern IntPtr GetPRocAddress(IntPtr hModule, string lpProcName); 22         [DllImport("kernel32", EntryPoint = "FreeLibrary", SetLastError = true)] 23         static extern bool FreeLibrary(IntPtr hModule); 24         private IntPtr hModule = IntPtr.Zero; 25         private IntPtr farProc = IntPtr.Zero; 26         public void LoadDll(string lpFileName) 27         { 28             hModule = LoadLibrary(lpFileName); 29             if (hModule == IntPtr.Zero) 30             { 31                 throw (new Exception("沒有找到:" + lpFileName + ".")); 32             } 33         } 34         public void LoadDll(IntPtr HMODULE) 35         { 36             if (HMODULE == IntPtr.Zero) 37             { 38                 throw (new Exception("所傳入的函數庫模塊的句柄為空")); 39             } 40             hModule = HMODULE; 41         } 42         public void LoadFun(string lpProcName) 43         { 44             if (hModule == IntPtr.Zero) 45             { 46                 throw (new Exception("函數庫模塊的句柄為空,確保已進行加載dll操作")); 47             } 48             farProc = GetProcAddress(hModule, lpProcName); 49             if (farProc == IntPtr.Zero) 50             { 51                 throw (new Exception("沒有找到:" + lpProcName + "這個函數的入口點")); 52             } 53         } 54         public void LoadFun(string lpFileName, string lpProcName) 55         { 56             hModule = LoadLibrary(lpFileName); 57             if (hModule == IntPtr.Zero) 58             { 59                 throw (new Exception("沒有找到:" + lpFileName + ".")); 60             } 61             farProc = GetProcAddress(hModule, lpFileName); 62             if (farProc == IntPtr.Zero) 63             { 64                 throw (new Exception("沒有找到:" + lpProcName + "這個函數的入口點")); 65             } 66         } 67         public void UnLoadDll() 68         { 69             FreeLibrary(hModule); 70             hModule = IntPtr.Zero; 71             farProc = IntPtr.Zero; 72         } 73         public object Invoke(object[] ObjArray_Parameter, Type[] TypeArray_parameterType, ModePass[] ModePassArray_Parameter, Type Type_Return) 74         { 75             if (hModule == IntPtr.Zero) 76                 throw (new Exception("函數庫模塊的句柄為空,請確保進行了LoadLll操作")); 77             if (farProc == IntPtr.Zero) 78                 throw (new Exception("函數指針為空,請確保已進行LoadFun操作")); 79             if (ObjArray_Parameter.Length != ModePassArray_Parameter.Length) 80                 throw (new Exception("參數個數及其傳遞方式的個數不匹配")); 81             AssemblyName MyAssemblyName = new AssemblyName(); 82             MyAssemblyName.Name = "InvokeFun"; 83             AssemblyBuilder MyAssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(MyAssemblyName, AssemblyBuilderaccess.Run); 84             ModuleBuilder MyModuleBuilder = MyAssemblyBuilder.DefineDynamicModule("InvokeDll"); 85             MethodBuilder MyMethodBuilder = MyModuleBuilder.DefineGlobalMethod("FaultFun", MethodAttributes.Public | MethodAttributes.Static, Type_Return, TypeArray_parameterType); 86             ILGenerator IL = MyMethodBuilder.GetILGenerator(); 87             int i; 88             for (i = 0; i < ObjArray_Parameter.Length; i++) 89             { 90                 switch (ModePassArray_Parameter[i]) 91                 { 92                     case ModePass.ByValue: 93                         IL.Emit(OpCodes.Ldarg, i); 94                         break; 95                     case ModePass.ByRef: 96                         IL.Emit(OpCodes.Ldarga, i); 97                         break; 98                     default: 99                         throw (new Exception("" + (i + 1).ToString() + "個參數沒有給定正確的傳遞方式"));100                 }101             }102             if (IntPtr.Size == 4)103             {104                 IL.Emit(OpCodes.Ldc_I4, farProc.ToInt32());105             }106             else if (IntPtr.Size == 8)107             {108                 IL.Emit(OpCodes.Ldc_I8, farProc.ToInt64());109             }110             else111             {112                 throw new PlatformNotSupportedException();113             }114             IL.EmitCalli(OpCodes.Calli, CallingConvention.StdCall, Type_Return, TypeArray_parameterType);115             IL.Emit(OpCodes.Ret);116             MyModuleBuilder.CreateGlobalFunctions();117             MethodInfo MyMethodInfo = MyModuleBuilder.GetMethod("FaultFun");118             return MyMethodInfo.Invoke(null, ObjArray_Parameter);119         }120         public object Invoke(IntPtr IntPtr_Function, object[] ObjArray_Parameter, Type[] TypeArray_ParameterType, ModePass[] ModePassArray_Parameter, Type Type_Return)121         {122             if (hModule == IntPtr.Zero)123                 throw (new Exception("函數庫模塊的句柄為空,請確保已進行LoadDll操作"));124             if (IntPtr_Function == IntPtr.Zero)125                 throw (new Exception("函數指針IntPtr_Function為空"));126             farProc = IntPtr_Function;127             return Invoke(ObjArray_Parameter, TypeArray_ParameterType, ModePassArray_Parameter, Type_Return);128         }129     }130 131 }

一直以來,對于C++程序員報以崇高的敬意。。。一直覺得他們屌屌的,哈哈。

調用方式如下:

1 PlusFunction.LoadDll(@"C:/win32dll.dll");//PlusFunction為調用類的實例2 PlusFunction.LoadFun("MyFun");3 byte[] a = File.ReadAllBytes(@"E:/19-bw/19-73.jpg");4 object[] Parameters = new object[] {a}; // 實參為a5 Type[] ParameterTypes = new Type[] { typeof(byte[])}; // 實參類型為byte[]6 ModePass[] themode = new ModePass[] {ModePass.ByValue}; // 傳送方式為值傳7 Type Type_Return = typeof(int); // 返回類型為int8 ret = (int)PlusFunction.Invoke(Parameters, ParameterTypes, themode, Type_Return);

其實,c++與c#主要的就是數據類型的對應了。簡單點的還好說,稍微復雜的各種麻煩。。。關鍵是不好調試。

下面舉些我用到的例子,以后遇到其他的再補充。日積月累- -

 1 c++                                    c# 2 char*                                char[](string.tochararray) 3 byte*                                 byte[] 4 int                                    int 5 int*                                    int[] 6 結構體 7 c++ 8 typedef struct SRectChange_TAG 9 {10     //NV_RECT rect;11     int x;//左上角x軸坐標12     int y;//左上角y軸坐標13     int width;//14     int height;//15     int degree;//報錯級別;1最低,目前暫時設定3級16 }17 SRectChange;18 c#19 [StructLayout(LayoutKind.Sequential)]20 public struct SRectChange21 {22     public int x;23     public int y;24     public int width;25     public int height;26     public int degree;27 }28 結構體傳遞29 [DllImport("win32dll.dll", EntryPoint = "MyFun", CallingConvention = CallingConvention.Cdecl)]30 public static extern int MyFun(ref SRectChange rect, char[] str, char[] str2);   31 c++結構體32 typedef struct      33 {    34     int osVersion;    35     int majorVersion;    36     int minorVersion;    37     int buildNum;    38     int platFormId;    39     char szVersion[128];    40 }OSINFO; 41 c#42 // OSINFO定義  43 [StructLayout(LayoutKind.Sequential)]  44 public struct OSINFO  45 {  46     public int osVersion;  47     public int majorVersion;  48     public int minorVersion;  49     public int buildNum;  50     public int platFormId;  51     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]  52     public string szVersion;  53 }  54 55 結構體數組傳遞56 c#代碼57 [DllImport("win32dll.dll", EntryPoint = "MyFun", CallingConvention = CallingConvention.Cdecl)]58 public static extern int MyFun(IntPtr p, char[] str, char[] str2);  59 數組傳指針60 char[] newpic = ("123123123123").ToCharArray();61 char[] oldpic = ("231231234123").ToCharArray();62 SRectChange[] rects = new SRectChange[5];63 for (int i = 0; i < rects.Length; i++)64 {65     rects[i] = new SRectChange();66 }67 IntPtr[] ptArr = new IntPtr[1];68 ptArr[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SRectChange)) * 5); //分配包含兩個元素的數組  69 IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SRectChange)));70 Marshal.Copy(ptArr, 0, pt, 1); //拷貝指針數組71 MyFun(pt, newpic, oldpic);72 for (int i = 0; i < 5; i++)73 {74     rects[i] = (SRectChange)Marshal.PtrToStructure((IntPtr)(pt.ToInt32() + i * Marshal.SizeOf(typeof(SRectChange))), typeof(SRectChange));75     Console.WriteLine("x:{0} y:{1}", rects[i].x, rects[i].y);76 }

還說那句話:種一棵樹最好的時間是十年前,其次是現在。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品日韩久久久久| 国产精品嫩草影院一区二区| 日韩成人激情在线| 国产91精品久久久久| 国产69精品99久久久久久宅男| 亚洲娇小xxxx欧美娇小| 91久久久久久久久久久久久| 国产成人高潮免费观看精品| 久久精视频免费在线久久完整在线看| 国产视频精品一区二区三区| 亚洲中国色老太| 最近2019免费中文字幕视频三| 久久久国产91| 久久久久久久国产精品视频| 91精品免费久久久久久久久| 国产午夜精品一区理论片飘花| 欧美视频国产精品| 久久精品国产99国产精品澳门| 高清日韩电视剧大全免费播放在线观看| 欧美电影免费观看网站| 欧美激情网友自拍| 欧美亚洲激情在线| 欧美成人精品三级在线观看| 亚洲一区中文字幕在线观看| 亚洲国产又黄又爽女人高潮的| 久久精品国产久精国产一老狼| 最近2019年日本中文免费字幕| 日韩av免费看网站| 国产日韩中文字幕在线| 亚洲免费视频网站| 亚洲欧美日韩一区二区三区在线| 高清日韩电视剧大全免费播放在线观看| 欧美激情2020午夜免费观看| 国产精品一区专区欧美日韩| 午夜精品久久久久久久99热浪潮| 亚洲性av网站| 欧美黄网免费在线观看| 欧美国产中文字幕| 韩国精品久久久999| 91久久久久久久久久久| 国产精品视频免费观看www| 亚洲aⅴ日韩av电影在线观看| 57pao精品| 久久久国产一区| 97热精品视频官网| 国产日韩欧美在线播放| 欧美激情图片区| 一区三区二区视频| 视频在线一区二区| 欧美做受高潮1| 日韩av在线最新| 日韩电影大全免费观看2023年上| 成人国产精品久久久久久亚洲| 日韩视频在线免费观看| 精品成人久久av| 亚洲视频视频在线| 一本色道久久88综合日韩精品| 久久久久久国产精品美女| 久久精品在线播放| 国产精品福利在线观看| 日产精品99久久久久久| 久久综合免费视频影院| 亚洲视屏在线播放| 日韩精品一区二区三区第95| 成人精品久久av网站| 蜜月aⅴ免费一区二区三区| 欧美成人三级视频网站| 久久久久久久97| 美日韩精品免费观看视频| 欧美日韩国产黄| 欧美日韩视频免费播放| 国产精品毛片a∨一区二区三区|国| 日韩精品中文在线观看| 日韩av在线免费观看一区| 亚洲а∨天堂久久精品9966| 国产精品99免视看9| 国产精品高潮在线| 国产98色在线| 国产精品亚洲аv天堂网| 国产精品久久久久久av| 在线视频精品一| 亚洲图片在区色| 色婷婷亚洲mv天堂mv在影片| 97在线看福利| 亚洲欧美日韩精品久久| 91精品国产自产在线| 日韩av中文字幕在线免费观看| 欧美一区三区三区高中清蜜桃| 欧美高清第一页| 国产精品日本精品| 精品国偷自产在线视频99| 国产+成+人+亚洲欧洲| 中文字幕亚洲欧美日韩2019| 亚洲第一区在线| 亚洲男人的天堂在线| 欧美性生交大片免费| 日韩免费在线视频| 91chinesevideo永久地址| 国产精品视频精品| 91久久精品国产91久久性色| 亚洲一区二区黄| 日本亚洲欧洲色| 91理论片午午论夜理片久久| 亚洲精品国产综合区久久久久久久| 91精品免费久久久久久久久| 国产精品18久久久久久麻辣| 欧美日韩久久久久| 日韩av网站导航| 日韩在线观看免费高清| 久久久久久高潮国产精品视| 日韩免费观看在线观看| 欧美成人三级视频网站| 国产精品日韩专区| 久久久精品国产| 亚洲福利视频在线| 国产精品丝袜一区二区三区| 成人高清视频观看www| 亚洲一区二区三区在线视频| 国产精品看片资源| 亚洲伊人一本大道中文字幕| 国产黑人绿帽在线第一区| 久久精品99国产精品酒店日本| 国产精品久久久久久久久久东京| 亚洲视频在线观看免费| 在线观看91久久久久久| 91热精品视频| 国产国产精品人在线视| 欧美日韩免费在线观看| 欧美日韩免费一区| 欧美黄色www| 国产精品日日摸夜夜添夜夜av| 色综合导航网站| 精品美女国产在线| 成人激情春色网| 欧美大片在线看免费观看| 91精品视频在线免费观看| 成人国产精品色哟哟| 91久久在线观看| 日韩电影中文字幕在线观看| 日韩av片免费在线观看| 大量国产精品视频| 91国在线精品国内播放| 久久91亚洲精品中文字幕奶水| 日本免费久久高清视频| 国产精品色视频| 九九视频直播综合网| 97香蕉超级碰碰久久免费软件| 国产精品a久久久久久| 精品国产精品三级精品av网址| 日韩免费电影在线观看| 成人写真福利网| 欧美—级a级欧美特级ar全黄| 综合136福利视频在线| 久久九九精品99国产精品| 国产精品jvid在线观看蜜臀| 另类专区欧美制服同性| 亚洲欧美另类国产| 日韩成人在线免费观看| 日韩欧美在线视频| 久久久久久久久电影| 亚洲aⅴ日韩av电影在线观看| 美女国内精品自产拍在线播放| 国产精品视频在线观看| 国产精品日韩欧美综合|