c#调用c++ dll 入坑记录

一、DLL引用坑c++

  [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.Ansiweb

调用约定  CallingConvention = CallingConvention.Cdecl数组

回调函数注意要加 [MarshalAs(UnmanagedType.FunctionPtr)]  表示为函数指针醉了函数

二、复杂结构坑工具

 [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        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 = 64)]
            public string m_szUserName;
            /// <summary>
            /// 长度64 szUserCode为代理用户密码
            /// </summary>
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
            public string m_szUserCode;
            public SERVADDR m_ProxyAddr;
            /// <summary>
            /// 下列地址数目 
            /// </summary> 
            public int m_nNum;
            /// <summary>
            /// 地址数组
            /// </summary>
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
            public SERVADDR[] m_ServAddr;
        }

char 变量名 [64]  对应    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]  public string m_szUserName;测试

结构数组  对应 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]编码

类型对应处处都查获得spa

超级大深坑 结构对齐问题尼玛   [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]代理

三、字符串返回操做  指针

     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[50000];
strcpy(zzzzz, querstring11.data());
 cout<<zzzzz<<endl;
return zzzzz; 

 

四、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

相关文章
相关标签/搜索