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

相關文章
相關標籤/搜索