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 应用 对应官方文档地址: ...
随机推荐
- RAC系统化学习
1.RACSignal: // 只要订阅者调用sendNext,就会执行nextBlock // 只要订阅RACDynamicSignal,就会执行didSubscribe // 前提条件是RAC ...
- ElasticSearch 2 (4) - API Convention
ElasticSearch 2.1.1 (4) - API Convention The elasticsearch REST APIs are exposed using JSON over HTT ...
- webpack 搭建vue项目流程
1.安装node 2.打开命令行输入 npm install -g vue-cli 3.vue init webpack-simple vue 4.各种确认(enter键) 5.npm instal ...
- 【大数据】Sqoop学习笔记
第1章 Sqoop简介 Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MyS ...
- BZOJ2561 最小生成树(最小割)
考虑kruskal的过程:按边权从小到大考虑,如果这条边的两端点当前不连通则将其加入最小生成树.由此可以发现,某条边可以在最小生成树上的充要条件是其两端点无法通过边权均小于它的边连接. 那么现在我们需 ...
- luogu2678 [NOIp2015]跳石头 (二分答案+贪心)
先二分出一个x,我们要算使最近的跳跃距离>=x的最少移除数量是否<=M就可以了 然后就别dp了...贪心就完事了...我肯定能不移就不移比较好... #include<bits/st ...
- 浅谈使用NIO,AIO的感受
花了十多天的时间把原来的WEB服务由BIO(阻塞IO)模式改写成NIO(非阻塞IO)模式,然后在xp机子上用ab测试并发性能,确实提升了30%左右的并发性能,测试完成后,当时感觉还是挺满意的.几天前在 ...
- Docker下的Spring Cloud三部曲之一:极速体验
版权声明:欢迎转载,请注明出处,谢谢. http://blog.csdn.net/boling_cavalry/article/details/79177930 目录(?)[+] 从本章开始, ...
- git安装与初始化
命令行 Git有多重方式使用 原生命令行,才能使用git所有命令,会git命令再去用gui图形工具,完全无压力 GUI图形软件,只是实现了git的部分功能,以减免操作难度,难以记住git原生命令 不同 ...
- bzoj千题计划255:bzoj3572: [Hnoi2014]世界树
http://www.lydsy.com/JudgeOnline/problem.php?id=3572 明显需要构造虚树 点属于谁管理分三种情况: 1.属于虚树的点 2.在虚树上的边上的点 3.既不 ...