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

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

            C++的DLL工程里面全都是些C語言的函數而已,單純的從DLL中導出再對應到一個C#的類里面。實在很難接受這樣子的設計,美其名曰C#是一個比C++更簡單純面向對象的語言,好像他們真正的明白面向對象是什么一樣,可是底層還是要用C++,讓人氣不過的就是其實用的是C語言。這是什么樣子的設計,是面向對象的設計嗎?那么多的底層DLL工程代碼全都是用C語言寫的函數而已。如此多的核心代碼都是用C語言寫的,可以想象這個工程會多么的難以維護;我只是一個初級的程序員,這樣的代碼我看著就是想吐。

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

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

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

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

            三、添加頭文件MyClass.h 內容入下:

             

             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  內容如下:

             

             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 內容如下:
            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 內容如下:

             

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

             

            五、在項目屬性設置默認

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

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

            八、修改Program.cs文件 內容如下:

             

             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設為啟動工程就可以了。這個例子很簡單,C#只是簡單調用了DLL中的幾個導出的接口函數,它們其實沒有做什么,就有CreateObj和DeleteObj很重要,其它的函數只是簡單的把CMyClass的公共成員函數包了一下。這樣子就可以用C#使用C++所寫的類了,我們核心的代碼還是用面向對象的方法來實現的,而且本質上我們是用了對象來幫助我們做事的。

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

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

            評論

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

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

            日韩久久久久中文字幕人妻| 亚洲国产精品无码久久SM| 久久久国产精品亚洲一区| 欧美精品国产综合久久| 亚洲伊人久久成综合人影院 | 久久精品国产99久久香蕉| 1000部精品久久久久久久久| 久久亚洲精品无码AV红樱桃| 思思久久99热只有频精品66| 97香蕉久久夜色精品国产| 欧美午夜精品久久久久久浪潮| 久久国产香蕉视频| 久久久免费观成人影院 | 国产高潮国产高潮久久久| 久久伊人精品青青草原高清| 色成年激情久久综合| 国产高潮久久免费观看| …久久精品99久久香蕉国产 | 欧美麻豆久久久久久中文| 亚洲Av无码国产情品久久| 热99RE久久精品这里都是精品免费| 99久久香蕉国产线看观香| 天堂久久天堂AV色综合 | 亚洲国产精品久久久久久| 国产日韩久久久精品影院首页| 久久久久99精品成人片牛牛影视| 一本久久a久久精品综合香蕉| 久久久久久精品免费看SSS| 九九精品99久久久香蕉| 国产—久久香蕉国产线看观看| 色婷婷综合久久久久中文字幕| 久久亚洲国产成人精品性色| Xx性欧美肥妇精品久久久久久| 久久国产劲爆AV内射—百度| 久久综合久久综合九色| 亚洲日本va中文字幕久久| 久久九九全国免费| 无码国内精品久久人妻| 久久久青草青青国产亚洲免观| 久久国产色AV免费观看| 模特私拍国产精品久久|