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 入坑记录的更多相关文章

  1. IDEA+maven+javafx(java 1.8)入坑记录

    序 好久没写博客了,主要是因为懒,写博客真的是个难坚持的事.但今天登上来看了看,之前记录ctf写的wp竟然点击量这么多了,突然让我有了继续写下去的动力. 这段时间遇到了好多事,中间也有想过写几篇文章记 ...

  2. React Native入坑记录

    1.render中如果使用props,直接用this.props.xxx,如果是在JSX中,用{this.props.xxx} 2.警告each child in an array or iterat ...

  3. Windows To Go入坑记录

    什么是Windows To Go? https://en.wikipedia.org/wiki/Windows_To_Go 微软为了解决企业用户的需求而推出,可以在u盘或者移动硬盘启动window系统 ...

  4. vue element InfiniteScroll 无限滚动 入坑记录

    select_law_by_tag() { this.laws_loading.is_loading = true; this.laws_loading.no_more = false; this.e ...

  5. Angular 从入坑到挖坑 - 组件食用指南

    一.Overview angular 入坑记录的笔记第二篇,介绍组件中的相关概念,以及如何在 angular 中通过使用组件来完成系统功能的实现 对应官方文档地址: 显示数据 模板语法 用户输入 组件 ...

  6. Angular 从入坑到挖坑 - 表单控件概览

    一.Overview angular 入坑记录的笔记第三篇,介绍 angular 中表单控件的相关概念,了解如何在 angular 中创建一个表单,以及如何针对表单控件进行数据校验. 对应官方文档地址 ...

  7. Angular 从入坑到挖坑 - HTTP 请求概览

    一.Overview angular 入坑记录的笔记第四篇,介绍在 angular 中如何通过 HttpClient 类发起 http 请求,从而完成与后端的数据交互. 对应官方文档地址: Angul ...

  8. Angular 从入坑到挖坑 - Router 路由使用入门指北

    一.Overview Angular 入坑记录的笔记第五篇,因为一直在加班的缘故拖了有一个多月,主要是介绍在 Angular 中如何配置路由,完成重定向以及参数传递.至于路由守卫.路由懒加载等&quo ...

  9. Angular 从入坑到挖坑 - 模块简介

    一.Overview Angular 入坑记录的笔记第七篇,介绍 Angular 中的模块的相关概念,了解相关的使用场景,以及知晓如何通过特性模块来组织我们的 Angular 应用 对应官方文档地址: ...

随机推荐

  1. HDU 2097 Sky数

    http://acm.hdu.edu.cn/showproblem.php?pid=2097 Problem Description Sky从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶然的机会, ...

  2. Jmeter使用笔记之意料之外的

    以下是在测试过程中按照以前loadrunner的思维来做的一点区别: 一.组织方式之setup 在用loadrunner做接口测试的时候如果不是针对login的测试,那么一般也会把login接口放到i ...

  3. Docker 下 mysql 简单的 主从复制实现

    1. 拉取镜像 docker pull mysql: 2. 运行这个镜像 docker run -d --name maser mysql: 3. 安装一些必要的软件 docker exec -it ...

  4. TRichEdit怎样新增的内容到最后一行?

    Delphi里使用TRichEdit,使用SetSelTextBuf时可以设置显示的字体格式,但是显示位置是在当前的插入光标后,如果人为改变插入光标的位置,比如在其他位置单,以后再插入的内容位置就没办 ...

  5. 洛谷P2387 [NOI2014]魔法森林(LCT)

    在XZY&XZZ巨佬的引领下,一枚蒟蒻终于啃动了这道题...... 这次还是第一次写LCT维护边权,还要化边为点,思路乱七八糟的,写起来也不顺手,还好调了许久终于AC啦. 贪心排序按一个关键字 ...

  6. springboot中radis配置和使用【进阶二】

    1.yml文件配置 #redis哨兵模式配置 redis: namespace: xxx:xxx:redis connection: cacheRedis: database: 0 timeout: ...

  7. Nginx多进程高并发、低时延、高可靠机制缓存代理中的应用

    1. 开发背景 现有开源缓存代理中间件有twemproxy.codis等,其中twemproxy为单进程单线程模型,只支持memcache单机版和redis单机版,都不支持集群版功能. 由于twemp ...

  8. 【BZOJ1081】[SCOI2005]超级格雷码(搜索)

    [BZOJ1081][SCOI2005]超级格雷码(搜索) 题面 BZOJ 洛谷 题解 找个规律吧,自己随便手玩一下,就按照正常的顺序枚举一下,发现分奇偶位考虑正序还是逆序就好了. #include& ...

  9. web开发中的跨域整理

    1.springboot通过CROS实现跨域: https://www.cnblogs.com/520playboy/p/7306008.html springboot下各种跨域方式: http:// ...

  10. eos交易同步过程和区块生产过程源码分析

    交易同步过程 1 通过命令cleos调用 cleos transfer ${from_account} ${to_account} ${quantity} 发起交易2 eos调用chain_plugi ...