• <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++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              1 隨筆 :: 0 文章 :: 2 評論 :: 0 Trackbacks

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

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

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

            下面是我寫的一個簡單的例子程序,雖然這個沒有什么,可是看起來心里舒服多了。

            一、用VS2005建立一個解決方案unlearn

            二、在解決方案unlearn中添加一個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

             

            五、在項目屬性設(shè)置默認

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

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

            八、修改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è)為啟動工程就可以了。這個例子很簡單,C#只是簡單調(diào)用了DLL中的幾個導(dǎo)出的接口函數(shù),它們其實沒有做什么,就有CreateObj和DeleteObj很重要,其它的函數(shù)只是簡單的把CMyClass的公共成員函數(shù)包了一下。這樣子就可以用C#使用C++所寫的類了,我們核心的代碼還是用面向?qū)ο蟮姆椒▉韺崿F(xiàn)的,而且本質(zhì)上我們是用了對象來幫助我們做事的。

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

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

            評論

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

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


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


            精品久久久久久国产91| 伊人色综合久久天天| 人妻精品久久久久中文字幕一冢本| 亚洲va中文字幕无码久久不卡| 久久精品国产亚洲综合色| 久久婷婷五月综合色99啪ak| 久久精品99久久香蕉国产色戒| 精品无码久久久久久国产| 奇米影视7777久久精品| 久久久黄片| 狠狠色丁香久久综合婷婷| 亚洲AV无码1区2区久久| 久久亚洲色一区二区三区| 国产精品99久久免费观看| 2021国产精品久久精品| 91亚洲国产成人久久精品网址| 国产成人久久精品一区二区三区| 国产成人精品久久一区二区三区av | 亚洲精品成人网久久久久久| 99麻豆久久久国产精品免费 | 久久精品男人影院| 嫩草伊人久久精品少妇AV| 亚洲欧美久久久久9999| 久久国产影院| 超级碰久久免费公开视频| 狠狠色丁香婷婷久久综合不卡| 少妇高潮惨叫久久久久久| 国产香蕉久久精品综合网| 人妻精品久久久久中文字幕| 99久久精品国产综合一区| 亚洲午夜精品久久久久久人妖| 国产亚洲精品美女久久久| 久久久噜噜噜www成人网| 色婷婷久久综合中文久久蜜桃av| 久久精品国产亚洲AV蜜臀色欲 | 丁香久久婷婷国产午夜视频| 国产精品久久久久久久| 99国产欧美久久久精品蜜芽| 韩国免费A级毛片久久| 91精品国产色综合久久| 国产精品免费福利久久|