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 = 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)]

類型對應到處都查得到

超級大深坑 結構對齊問題尼瑪   [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[50000];
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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM