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 应用 对应官方文档地址: ...
随机推荐
- Iterative Quantization,ITQ
Abstract 针对大规模的图像检索问题,论文提出了一个高效的ITQ算法.该算法先将中心化后的数据映射到超立方体的顶点上,再通过优化过程寻找一个旋转矩阵,使得数据点经过旋转后,与超立方体的顶点数据具 ...
- Apache修改了配置文件中的路径后,登录该地址网页出现问题 (其中介绍了selinux的域和安全上下文)
默认的网站数据存放在: /var/www/html 首页名称: index.html Apache服务程序的主配置文件: /etc/httpd/conf/httpd.conf (若是将 119 行 ...
- 软件工程作业 - Week 1
构建之法读后疑问: 初步的完成构建程序设计思路之后实现过程中发现了问题或者可以优化的地方是立马就改进还是完成之后按照步骤统一进行优化. 覆盖性测试,针对一些永远用不到只是用来预防极为极端的情况下,例如 ...
- ESXi 系统管理员命令 [转帖]
来源 https://blog.csdn.net/zy_strive_2012/article/details/53336000 正如所有的虚拟化管理员都知道,要应对VMware基础设施上需要的更多虚 ...
- Codeforces Round #485 Div. 1 vp记
A:对每种商品多源bfs一下每个点到该商品的最近距离,对每个点sort一下取前s个即可. #include<iostream> #include<cstdio> #includ ...
- 【刷题】LOJ 6226 「网络流 24 题」骑士共存问题
题目描述 在一个 \(\text{n} \times \text{n}\) 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入. 对于给定的 \(\t ...
- [BZOJ2957] [THU2013集训] 楼房重建
套路套路套路套路套路套路套路套路套路套路... 我只能这么说:一道裸得只剩下套路的水题... 线段树维护单调栈,显然,能够看到的楼房一定是递增的,但不是按高度递增,而是按高度和坐标的比值递增 所以我们 ...
- 解题:SCOI 2007 蜥蜴
题面 拆点跑最大流 所有能跑出去的点连向汇点,容量为inf 原点连向所有初始有蜥蜴的点,容量为1 每根柱子拆成两个点“入口”和“出口”,入口向出口连容量为高度的边,出口向别的有高度的柱子的入口连容量为 ...
- 输入一个十进制的数到dx_ax,然后十六进制转十进制输出
;HtoD data segment n dw ? data ends stack segment db dup(?) stack ends code segment assume cs:code,s ...
- Linux上java程序的jar包启动通用脚本(稳定用过)
Linux上java程序的jar包启动通用脚本如下: #! /bin/sh export LANG="zh_CN.GBK" SERVICE_NAME=` .sh` SCRIPT_N ...