C_and_CPP 板


LINE

※ 引述《Stevenashh (YO!!!)》之铭言: : 开发平台(Platform): WIN 7 : 编译器: visual studio 2017 : 额外使用到的函数库(Library Used): 外部dll : 问题(Question): : 平时是写C#,但近期需要使用C#呼叫其他厂商c++的dll(不晓得是manage还unmanage) : 查询利用DLLIMPORT可以呼叫 但失败了(应该不是使用错误) : 出现的错误如图 https://imgur.com/a/Hw9DX6G : 原文:https://goo.gl/if1WsW : Google到的原因是没有c++没有实作clr(=Unmaged?) : 但我看所有DLLIMPORT的教学都是说C#可以直接呼叫Unmanaged : 抱歉因为不太懂c++ : 跪求大大解惑是什麽原因,或是可以提供我关键字让我继续往下找 : 我应该做些什麽动作才能将这包dll转换成C#可以IMPORT的版本 : 补充说明(Supplement): : 愿以1000P微薄小心意回馈 首先要确认的是要引用的 dll 是 managed 或是 unmanaged。 - managed 指的是给CLR托管 有记忆体垃圾回收C#,VB,C++/CLI 属於这类。 - unmanaged 非托管的代码则是要自己得要处理记忆体问题, 传统的windows api或者COM介面或者是其他人写的native C++都是这种形式的。 (称native只是为了和C++/CLI有所区隔,可以想成是又快又猛又易翻车的C++) 依你要的需求,大概是使用C#来呼叫unmanaged code相去不远了。 这种用C#和原生C++掺在一块做牛丸的混合编程, 其中最直接相关库的就是 System.Runtime.InteropServices 这东西搞起来非常的麻烦,不仅要知道native c++的api形式, 还要熟悉C++与C#的用法规则,不然很容易出错也不好debug。 ## 在此我先弄一个范例: https://github.com/lightyen/WpfMessageBox 其中建立了一个WPF专案,设计一个按钮, 在点选了按钮之後会去呼叫user32.dll中的MessageBox来显示一个对话框。 如果你有一些工具软体去查看user32.dll,(例如DLL Export Viewer) 你会发现user32.dll存在两个与MessageBox有关的Function, 一个是A结尾一个是W结尾,A指的是ASCII,W指的是宽字元。 不过我们已经把CharSet设成Auto了,.NET平台会自动地去选择合适的。 (比较重要的点是在C#中,string全部是宽字元的,要和unmanaged code互通时要多留意) ## 好了,现在我们可以来实作牛丸了 首先新增一个*.cs 然宣告一个static class来当我们的介面参考, 然後再宣告一个static extern方法来描述MessageBox这个函式, 把函式名称、参数形式、返回值依照API文件规范依样画葫芦。 IntPtr在C++中代表的就是指标,而IntPtr.Zero则代表NULL, HWND是一个视窗的handle,也是一个整数。 (其实指标在记忆体中也不过是一个整数罢了。) (user32.dll不需要填绝对路径,因为windows已经内定注册了, 第三方的library应该还是要填详细的路径。) LPCTSTR =>'一个tchar的唯读字串',在这里用一个string代表。 使用了这个方法後,平台会隐隐地偷偷地把string的内容先放到unmanaged空间, 然後再做参数传给MessageBox。 假若今天要传的是一个物件(void*), 则我们必须先从unmanaged要一块记忆体空间,然後填上相应资料, 在透过IntPtr写入(或读出),最後用完後还要记得回收记忆体, 整个过程真的虾鸡巴麻烦的。 参考:System.Runtime.InteropServices.Marshal AllocHGlobal,FreeHGlobal,SizeOf ## 最後设计的部分 许多c++的函式都用一个整数代表功能的体现, 在C#中我们可以来为这些功能(flag)写成一个enum,加些注解, 或者把一些资料包装成一个class,再加上一些额外的功能, 使得在调用这些unmanaged code能更加舒服一些。 ## 更多的范例 https://github.com/lightyen/COMInterop ## 更多的关键字 pinvoke, Interop, DllImport, Marshal, IntPtr, UnmanagedType, StructLayout, MarshalAs --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 210.66.174.153
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1533698113.A.344.html
1F:推 petercoin: 给个推~ 08/08 13:40
2F:推 Schottky: 推,Unicode/ASCII function 确实常常制造问题要分清楚 08/08 17:04
3F:推 largesperm: 受益良多 推推 08/08 22:08
4F:推 s4300026: 先推再看 08/09 09:49
5F:→ tinlans: 对岸有一本 ISBN 是 9787115204349 的书不错看。 08/12 05:54
6F:→ tinlans: 虽说绝版但还买得到,只是书有附光碟不能走正常管道出境 08/12 05:55
7F:推 Killercat: 其实说麻烦就Marshal那段特别讨厌而已,很多c#其实都 08/17 08:18
8F:→ Killercat: 是刻UI然後把state全部给dll管的话 其实难度不高 08/17 08:19
9F:→ Killercat: dll要expose任何结构出来的是地狱麻烦鬼... 08/17 08:19







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP