c#调用c++ dll 入坑记录
1、DLL引用坑
[DllImport("NetDLL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int InitNet(ref MULSERVADDR pAddrs, [MarshalAs(UnmanagedType.FunctionPtr)]CallBackFun pFun);
c++ 默认编码 Ansi CharSet = CharSet.Ansi
调用约定 CallingConvention = CallingConvention.Cdecl
回调函数注意要加 [MarshalAs(UnmanagedType.FunctionPtr)] 表示为函数指针醉了
2、复杂结构坑
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = )]
public struct MULSERVADDR
{
/// <summary>
/// 代理类型
/// </summary>
public int m_nProxyType;
/// <summary>
/// 如果为1就是需要用户验证, 如果为0不需要用户验证
/// </summary>
public byte m_ucTimeOut;
/// <summary>
/// 长度64 其中的szUserName为代理用户名,
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = )]
public string m_szUserName;
/// <summary>
/// 长度64 szUserCode为代理用户密码
/// </summary>
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = )]
public string m_szUserCode;
public SERVADDR m_ProxyAddr;
/// <summary>
/// 下列地址数目
/// </summary>
public int m_nNum;
/// <summary>
/// 地址数组
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = )]
public SERVADDR[] m_ServAddr;
}
char 变量名 [64] 对应 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] public string m_szUserName;
结构数组 对应 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
类型对应到处都查得到
超级大深坑 结构对齐问题尼玛 [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
3、字符串返回操作
public unsafe static extern IntPtr GETCLIENTTYPE_MARKETBASE(CMDHEAD* x);
我目前用IntPtr 转换的 IntPtr test = NetDLL.GETCLIENTTYPE_MARKETBASE(pHead); string s1 = Marshal.PtrToStringAnsi(test); 扯淡扯淡那所谓的对应关系都尼玛扯淡 各种乱码坑死你不怕你不死 c++方代码 一定不要返回char*不然就等死把各种无力吐槽的感觉,可怕的c++ 太恶心了
char zzzzz[];
strcpy(zzzzz, querstring11.data());
cout<<zzzzz<<endl;
return zzzzz;
4、WCF超级大深坑 注意
wcf分为几种寄宿模式 可以寄宿在CS程序上如控制台 窗体程序等等、寄宿web IIS上、寄宿Windows服务上
目前常见的BS开发中也会将WCF实现rest 范式的访问解救支持AJAX直接调用
那么一般WCF选型肯定会选用 方便快捷的 寄宿在IIS上的方案
首先本地开发web wcf 在本地调试时候好像有一个工具启动目测WCF寄宿在这个上面 那个工具一眼就能看出是cs程序那么在本地调用c++ dll 只会碰到dll依赖出现问题 将依赖设置为绝对路径解决
但是当你发布了问题来了你会发现无论你怎么调试修改都无法加载bin目录下的dll 我也是醉了微软牛逼佩服你 总会给我们留下一堆坑
然后我转到控制台测试发布OK醉了但是你不会做个服务每次运行一个控制台吧
终于明白甲方给的.NET工程里面为什么出现了基本开发中很少使用的Windows服务了本人也就做一个电厂项目的时候用过这个懒玩意 安装只能依赖命令的蛋疼东西
于是WCF最终选型 Windows 寄宿WCF 开放一个远端调用端口
各位朋友碰到这些坑不要急不要怕不要放弃用时间去征服他如有同样入坑的同志们可以联系我QQ493409332
c#调用c++ dll 入坑记录的更多相关文章
- IDEA+maven+javafx(java 1.8)入坑记录
序 好久没写博客了,主要是因为懒,写博客真的是个难坚持的事.但今天登上来看了看,之前记录ctf写的wp竟然点击量这么多了,突然让我有了继续写下去的动力. 这段时间遇到了好多事,中间也有想过写几篇文章记 ...
- React Native入坑记录
1.render中如果使用props,直接用this.props.xxx,如果是在JSX中,用{this.props.xxx} 2.警告each child in an array or iterat ...
- Windows To Go入坑记录
什么是Windows To Go? https://en.wikipedia.org/wiki/Windows_To_Go 微软为了解决企业用户的需求而推出,可以在u盘或者移动硬盘启动window系统 ...
- vue element InfiniteScroll 无限滚动 入坑记录
select_law_by_tag() { this.laws_loading.is_loading = true; this.laws_loading.no_more = false; this.e ...
- Angular 从入坑到挖坑 - 组件食用指南
一.Overview angular 入坑记录的笔记第二篇,介绍组件中的相关概念,以及如何在 angular 中通过使用组件来完成系统功能的实现 对应官方文档地址: 显示数据 模板语法 用户输入 组件 ...
- Angular 从入坑到挖坑 - 表单控件概览
一.Overview angular 入坑记录的笔记第三篇,介绍 angular 中表单控件的相关概念,了解如何在 angular 中创建一个表单,以及如何针对表单控件进行数据校验. 对应官方文档地址 ...
- Angular 从入坑到挖坑 - HTTP 请求概览
一.Overview angular 入坑记录的笔记第四篇,介绍在 angular 中如何通过 HttpClient 类发起 http 请求,从而完成与后端的数据交互. 对应官方文档地址: Angul ...
- Angular 从入坑到挖坑 - Router 路由使用入门指北
一.Overview Angular 入坑记录的笔记第五篇,因为一直在加班的缘故拖了有一个多月,主要是介绍在 Angular 中如何配置路由,完成重定向以及参数传递.至于路由守卫.路由懒加载等&quo ...
- Angular 从入坑到挖坑 - 模块简介
一.Overview Angular 入坑记录的笔记第七篇,介绍 Angular 中的模块的相关概念,了解相关的使用场景,以及知晓如何通过特性模块来组织我们的 Angular 应用 对应官方文档地址: ...
随机推荐
- vis.js绘图库的一个BUG以及源码修正
1. BUG 1.1 BUG触发情况 在使用vis.js绘图时,加入两个节点A和B之间既存在一条从A指向B的边,同时也存在一条从B指向A的边,那么这个绘图库就会崩溃. 1.2 BUG解析 vis.js ...
- redis集群的测试
原文:http://blog.sina.com.cn/s/blog_53b45c4d0102wg10.html 1.测试存取值 客户端连接集群redis-cli需要带上 -c ,redis-cli - ...
- OneZero第四次站立会议(2016.3.24)
会议时间:2016年3月24日 15:30~15:47 会议成员:冉华,张敏,王巍,夏一鸣. 会议目的:汇报前一天工作,全体成员评论,确定会后修改内容. 会议内容:以下为会议插图 1.界面原型方面,在 ...
- Caffe使用: Ubuntu 14.04(x64) 从cuda 7.0 升级到 cuda8.0
由于之前已经在Ubuntu 14.04 x64上面安装cuda7.0+caffe, 并且已经配置好,caffe也已经跑通. 但是最近需要使用Torch,而Torch对cuda的要求是8.0,因此决定对 ...
- html5 & input & accept attribute
html5 & input & accept attribute html input accept attribute https://www.w3schools.com/TAGS/ ...
- js写插件教程深入
原文地址:https://github.com/lianxiaozhuang/blog 转载请注明出处 js 写插件教程深入 1.介绍具有安全作用域的构造函数 function Fn(name){ t ...
- 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- RabbitMQ的生产者和消费者
低级错误:启动程序的时候报错:socket close: 原因在配置文件中写的端口是:15672,应该是5672: client端通信口5672管理口15672server间内部通信口25672erl ...
- lrzsz 移植到 ARM-linux 嵌入式板子上
特别说明:SSH 或 串口 都可以使用 lrzsz 进行通信 lrzsz是一个Unix通信包,提供XMODEM.YMODEM和ZMODEM文件传输协议.lrzsz以前是Omen科技的主打软件,现在已经 ...
- 集合框架基础知识-----java基础知识
Java集合框架 :接口:Collection.List .Set. Map:实现类:ArrayList.LinkedList.Vector.HashSet.TreeSet.HashMap.HashT ...