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 应用 对应官方文档地址: ...
随机推荐
- XCODE 6.1.1 配置GLFW
最近在学习opengl的相关知识.第一件事就是配环境(好烦躁).了解了一下os x下的OpenGL开源库,主要有几个:GLUT,freeglut,GLFW等.关于其详细的介绍可以参考opengl网站( ...
- Elk 进阶部署
虚拟机两台: 192.168.1.42 192.168.1.46 系统环境保持一致: cat /etc/redhat-release uname -a elk准备环境保持一致: elasticsear ...
- div文本垂直居中(div text vertical aligan)
.box{ width: 135px;height: 84px;display: block; overflow: hidden; } .container { background:darkcyan ...
- BZOJ1050 HAOI2006旅行(最小生成树+LCT)
暴力枚举路径中权值最小边是哪个,然后求出边权不小于它的边的最小生成树,即可保证该路径上最大值最小.暴力当然可以过,这里使用LCT维护.注意数据中有自环. #include<iostream> ...
- MVC 锚点
MVC 锚点 linkText:生成的链接所显示的文字 actionName:对应控制器的方法 routeValues:向对应的action传递的参数 controlName:指定控制器的名称 htm ...
- 【刷题】BZOJ 4195 [Noi2015]程序自动分析
Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,-代表程序中出现的变量,给定n个形如xi=xj或x ...
- 【转】keil5 missing close quote 错误解决
在使用utf8保存文件的情况下,代码中出现中文字符串会提示missing close quote解决:Options for Target --> C/C++ --> Misc Contr ...
- C源程序怎么变成可执行文件
本文所有内容都是来自网上的转载,文末有转载链接. 电子计算机所使用的是由“0”和“1”组成的二进制数,二进制是计算机的语言的基础.计算机发明之初,人们只能降贵纡尊,用计算机的语言去命令计算机干这干那, ...
- luogu2375 动物园 (kmp)
首先求出fail数组,如果没有不重叠的限制的话,我们可以在求fail的时候递推出个数cnt[i]=cnt[fail[i]]+1(这个cnt是算上自己本身==自己本身的) 然后如果是要求不重叠的话,就是 ...
- POJ 3660 Cow Contest / HUST 1037 Cow Contest / HRBUST 1018 Cow Contest(图论,传递闭包)
POJ 3660 Cow Contest / HUST 1037 Cow Contest / HRBUST 1018 Cow Contest(图论,传递闭包) Description N (1 ≤ N ...