• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            欣蘭之家

            Forever

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              1 隨筆 :: 0 文章 :: 2 評(píng)論 :: 0 Trackbacks

            剛開(kāi)始參加一個(gè)項(xiàng)目,工程的代碼以前的人已經(jīng)寫(xiě)得差不多了。GUI是用C#寫(xiě)的,底層調(diào)用的是C++的DLL。

            C++的DLL工程里面全都是些C語(yǔ)言的函數(shù)而已,單純的從DLL中導(dǎo)出再對(duì)應(yīng)到一個(gè)C#的類里面。實(shí)在很難接受這樣子的設(shè)計(jì),美其名曰C#是一個(gè)比C++更簡(jiǎn)單純面向?qū)ο蟮恼Z(yǔ)言,好像他們真正的明白面向?qū)ο笫鞘裁匆粯樱墒堑讓舆€是要用C++,讓人氣不過(guò)的就是其實(shí)用的是C語(yǔ)言。這是什么樣子的設(shè)計(jì),是面向?qū)ο蟮脑O(shè)計(jì)嗎?那么多的底層DLL工程代碼全都是用C語(yǔ)言寫(xiě)的函數(shù)而已。如此多的核心代碼都是用C語(yǔ)言寫(xiě)的,可以想象這個(gè)工程會(huì)多么的難以維護(hù);我只是一個(gè)初級(jí)的程序員,這樣的代碼我看著就是想吐。

            可能是有一點(diǎn)很惡心,C#好像是不可能直接使用用C++所寫(xiě)的類,可是我們也還是有辦法做到讓C#本質(zhì)上還是使用的用C++代碼產(chǎn)生的對(duì)象的。在DLL里面我們只是簡(jiǎn)單的用一些導(dǎo)出的接口函數(shù)讓C#使用,而這個(gè)DLL內(nèi)部本質(zhì)上還是用一個(gè)(或者多個(gè),還可以是一個(gè)類系統(tǒng))對(duì)象來(lái)維護(hù)的。可是他們就是不愿意這樣子做,讓我們現(xiàn)在的工作很難進(jìn)行,寫(xiě)的代碼不能入目。

            下面是我寫(xiě)的一個(gè)簡(jiǎn)單的例子程序,雖然這個(gè)沒(méi)有什么,可是看起來(lái)心里舒服多了。

            一、用VS2005建立一個(gè)解決方案unlearn

            二、在解決方案unlearn中添加一個(gè)VC++的Win32 DLL工程CppDLL

            三、添加頭文件MyClass.h 內(nèi)容入下:

             

             1#ifndef __MYCLASS_H__
             2#define __MYCLASS_H__
             3
             4#include <iostream>
             5#include <string>
             6
             7using namespace std;
             8
             9class CMyClass
            10{
            11public:
            12 CMyClass(string name)
            13 {
            14  if (name.size() <= static_cast<size_t>(0))
            15  {
            16   objName = "noname";
            17  }

            18  objName = name;
            19 }

            20
            21 void PrintName()
            22 {
            23  cout << objName << endl;
            24 }

            25
            26 bool MallocString(char *&pStr, int &size)
            27 {
            28  pStr = new char[5];
            29  pStr[0= 'a';
            30  pStr[1= 'b';
            31  pStr[2= 'c';
            32  pStr[3= 'd';
            33  pStr[4= '\0';
            34  size = 5;
            35  return true;
            36 }

            37
            38 bool FreeString(char *&pStr)
            39 {
            40  if (pStr == 0)
            41  {
            42   return false;
            43  }

            44  cout << pStr << endl;
            45  delete []pStr;
            46  pStr = 0;
            47  return true;
            48 }

            49
            50private:
            51 string objName;
            52}
            ;
            53
            54#endif // __MYCLASS_H__


            三、添加頭文件ExportFunc.h  內(nèi)容如下:

             

             1#ifndef __EXPORTFUNC_H__
             2#define __EXPORTFUNC_H__
             3
             4#include "MyClass.h"
             5
             6bool CreateObj(char *name);
             7bool DeleteObj();
             8void OperateObj();
             9bool CreateString(char *&pStr, int &size);
            10bool FressString(char *&pStr);
            11
            12#endif // __EXPORTFUNC_H__
            13
            14四、添加源文件ExportFunc.cpp 內(nèi)容如下:
            15
            16#include "stdafx.h"
            17#include "ExportFunc.h"
            18
            19CMyClass *pObj = NULL;
            20
            21bool CreateObj(char *name)
            22{
            23 DeleteObj();
            24 pObj = new CMyClass(string(name));
            25 return true;
            26}

            27
            28bool DeleteObj()
            29{
            30 if (pObj != NULL)
            31 {
            32  delete pObj;
            33  pObj = NULL;
            34 }

            35 return true;
            36}

            37
            38void OperateObj()
            39{
            40 if (pObj == NULL)
            41 {
            42  return ;
            43 }

            44 pObj->PrintName();
            45}

            46
            47bool CreateString(char *&pStr, int &size)
            48{
            49 if (pObj == NULL)
            50 {
            51  return false;
            52 }

            53 return pObj->MallocString(pStr, size);
            54}

            55
            56bool FressString(char *&pStr)
            57{
            58 if (pObj == NULL)
            59 {
            60  return false;
            61 }

            62 return pObj->FreeString(pStr);
            63}


            四、添加模塊定義文件CppDll.def 內(nèi)容如下:

             

            1LIBRARY "CppDll"
            2EXPORTS
            3 CreateObj
            4 DeleteObj
            5 OperateObj
            6 CreateString
            7 FressString

             

            五、在項(xiàng)目屬性設(shè)置默認(rèn)

            六、在解決方案unlearn中添加一個(gè)C#的控制臺(tái)應(yīng)用程序項(xiàng)目CSApp

            七、項(xiàng)目屬性->生成->輸出路徑改為"..\debug\" (其實(shí)就是讓兩個(gè)項(xiàng)目的輸出結(jié)果放在一個(gè)地方,debug版本C++工程默認(rèn)的輸出路徑是這個(gè))

            八、修改Program.cs文件 內(nèi)容如下:

             

             1using System.Runtime.InteropServices;
             2
             3namespace CSApp
             4{
             5    class TestDll
             6    {
             7        [DllImport("CppDll.dll", CharSet = CharSet.Ansi)]
             8        public static extern bool CreateObj(string name);
             9        [DllImport("CppDll.dll", CharSet = CharSet.Ansi)]
            10        public static extern bool DeleteObj();
            11        [DllImport("CppDll.dll", CharSet = CharSet.Ansi)]
            12        public static extern void OperateObj();
            13        [DllImport("CppDll.dll", CharSet = CharSet.Ansi)]
            14        public static extern bool CreateString(out IntPtr pStr, out int size);
            15        [DllImport("CppDll.dll", CharSet = CharSet.Ansi)]
            16        public static extern bool FressString(out IntPtr pStr);
            17    }

            18
            19    class Program
            20    {
            21        static void Main(string[] args)
            22        {
            23            IntPtr pStr = IntPtr.Zero;
            24            int size = 0;
            25            TestDll.CreateObj("huymou");
            26            TestDll.OperateObj();
            27            TestDll.CreateString(out pStr, out size);
            28            TestDll.FressString(out pStr);
            29            TestDll.DeleteObj();
            30        }

            31    }

            32}

             

            把CSApp設(shè)為啟動(dòng)工程就可以了。這個(gè)例子很簡(jiǎn)單,C#只是簡(jiǎn)單調(diào)用了DLL中的幾個(gè)導(dǎo)出的接口函數(shù),它們其實(shí)沒(méi)有做什么,就有CreateObj和DeleteObj很重要,其它的函數(shù)只是簡(jiǎn)單的把CMyClass的公共成員函數(shù)包了一下。這樣子就可以用C#使用C++所寫(xiě)的類了,我們核心的代碼還是用面向?qū)ο蟮姆椒▉?lái)實(shí)現(xiàn)的,而且本質(zhì)上我們是用了對(duì)象來(lái)幫助我們做事的。

            當(dāng)然可能本人見(jiàn)識(shí)不夠,不知道還有更好的辦法,現(xiàn)在我也是剛剛想到這些的,好多都可以完善。最后還是一句話,我永遠(yuǎn)喜歡C++,我相信C++可以做得更好、更出色,不想看到亂用C++的事情出現(xiàn);有些人亂用了C++,還說(shuō)C++一大堆的壞話。真正大型的工程其實(shí)C++才是最適合的。

            posted on 2009-08-20 22:53 胡友蒙 閱讀(1041) 評(píng)論(2)  編輯 收藏 引用

            評(píng)論

            # re: 對(duì)工作很無(wú)奈(請(qǐng)正確在C#中使用C++好嗎) 2009-08-21 11:23 Norz
            施主,你著相了...  回復(fù)  更多評(píng)論
              

            # re: 對(duì)工作很無(wú)奈(請(qǐng)正確在C#中使用C++好嗎) 2009-08-21 16:58 陳梓瀚(vczh)
            C++/CLI也挺合適的,可以用unmanaged code,可以用unsafe managed code,也可以用managed code。用managed code做出來(lái)的dll可以直接丟給C#用,無(wú)縫結(jié)合。  回復(fù)  更多評(píng)論
              


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久99亚洲网美利坚合众国| 91精品国产色综合久久| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 亚洲AV无码久久精品蜜桃| 国内精品久久久久久久久| 久久亚洲国产午夜精品理论片| 亚洲乱码日产精品a级毛片久久| 久久久不卡国产精品一区二区 | 久久亚洲AV成人无码电影| 久久精品国产AV一区二区三区| 伊人色综合久久天天人守人婷| 色婷婷久久久SWAG精品| 人妻少妇精品久久| 中文成人久久久久影院免费观看| 人妻无码精品久久亚瑟影视| 国产亚洲成人久久| 久久综合色区| 99久久精品国产一区二区| 亚洲AV无码久久| 精品久久777| 精品久久久久久久久久中文字幕 | 四虎国产精品成人免费久久 | 久久亚洲AV成人无码电影| 狠狠色丁香久久婷婷综合五月| 国产精品一久久香蕉国产线看| 日本福利片国产午夜久久| 久久精品无码一区二区三区日韩| 色婷婷久久综合中文久久一本| 久久精品中文无码资源站| 久久精品国产亚洲AV麻豆网站 | 女同久久| 久久综合综合久久综合| 精品一区二区久久| 日批日出水久久亚洲精品tv| 亚洲精品乱码久久久久久久久久久久| 国产精品美女久久久久| 久久久噜噜噜久久中文字幕色伊伊| 色天使久久综合网天天| 国产精品久久国产精品99盘 | 亚洲AV日韩精品久久久久久久| 精品久久久久久国产91|