• <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>
            posts - 17,  comments - 2,  trackbacks - 0


            一 混合類(lèi)

            所謂混合類(lèi)是指CLI/C++中native的Class中可以包含CLR對(duì)象,CLR的class也可以包含Naitve的對(duì)象。

            1)native的class中包含CLR對(duì)象,必須通過(guò)gcroot<>或auto_gcroot<>。
            2)CLR中的class中包含native的對(duì)象,必須是指針,也可以使用高手寫(xiě)的CAutoNativePtr智能指針。


            注意:C#中不能調(diào)用CLI/C++中的Native的class。同樣Native C++中也不能調(diào)用CLI/C++中的Ref的class。

            二 實(shí)例

             高手的CAutoNativePtr類(lèi):

            /***
                CAutoNativePtr - A smart pointer for using native objects in managed code.

                Author    :    Nishant Sivakumar
                Email    :    voidnish@gmail.com    
                Blog    :    
            http://blog.voidnish.com
                Web        :    
            http://www.voidnish.com     

                You may freely use this class as long as you include
                this copyright. 
                
                You may freely modify and use this class as long
                as you include this copyright in your modified version. 

                This code is provided "as is" without express or implied warranty. 
                
                Copyright ?Nishant Sivakumar, 2006.
                All Rights Reserved.
            **
            */


            #pragma once

            template
            <typename T> ref class CAutoNativePtr
            {
            private:
                T
            * _ptr;

            public:
                CAutoNativePtr() : _ptr(nullptr)
                
            {
                }


                CAutoNativePtr(T
            * t) : _ptr(t)
                
            {
                }


                CAutoNativePtr(CAutoNativePtr
            <T>% an) : _ptr(an.Detach())
                
            {
                }


                template
            <typename TDERIVED> 
                    CAutoNativePtr(CAutoNativePtr
            <TDERIVED>% an) : _ptr(an.Detach())
                
            {
                }


                
            !CAutoNativePtr()
                
            {    
                    delete _ptr;
                }


                
            ~CAutoNativePtr()
                
            {
                    
            this->!CAutoNativePtr();
                }


                CAutoNativePtr
            <T>% operator=(T* t)
                
            {
                    Attach(t);
                    
            return *this;
                }


                CAutoNativePtr
            <T>% operator=(CAutoNativePtr<T>% an)
                
            {
                    
            if(this != %an)
                        Attach(an.Detach());
                    
            return *this;
                }


                template
            <typename TDERIVED> 
                    CAutoNativePtr
            <T>% operator=(CAutoNativePtr<TDERIVED>% an)
                
            {
                    Attach(an.Detach());
                    
            return *this;
                }


                
            static T* operator->(CAutoNativePtr<T>% an)
                
            {
                    
            return an._ptr;
                }


                
            static operator T*(CAutoNativePtr<T>% an)
                
            {
                    
            return an._ptr;
                }


                T
            * Detach()
                
            {
                    T
            * t = _ptr;
                    _ptr 
            = nullptr;
                    
            return t;
                }


                
            void Attach(T* t)
                
            {
                    
            if(t)
                    
            {    
                        
            if(_ptr != t)
                        
            {
                            delete _ptr;
                            _ptr 
            = t;
                        }

                    }

                    
            else
                    
            {
            #ifdef _DEBUG
                        
            throw gcnew Exception(
                            
            "Attempting to Attach() a nullptr!");
            #endif
                    }
                    
                }


                
            void Destroy()
                
            {
                    delete _ptr;
                    _ptr 
            = nullptr;
                }

            }
            ;

            測(cè)試實(shí)例之CLI/C++文件:
            // MixedNativeAndCLIDLL.h

            #pragma once
            #include 
            <string>
            #include 
            <iostream>
            #include 
            <gcroot.h>
            #include 
            <msclr/auto_gcroot.h>

            #include 
            "AutoNative.h"

            using namespace System;

            namespace MixedNativeAndCLIDLL {

                
            public class NativeClass
                
            {
                
            public:
                    
            int *pX;    
                    NativeClass()
            {pX = new int(10);}
                    
            ~NativeClass()
                    
            {
                        
            if(pX != NULL)
                        
            {
                            delete pX;
                            pX 
            = NULL;
                        }

                    }
                    
                }
            ;

                
            public ref class RefClass
                
            {
                
            public:
                    
            int x;    
                    RefClass()
            {x = 20;}
                }
            ;

                
            public class MixedClass0
                
            {
                    
            public:
                        NativeClass nativeClass;
                        
            //RefClass refClass; // error c3265 and error c3149
                        gcroot<RefClass^> refClass1;

                        std::
            string nativeStr;
                        
            //System::String refStr; // error c3265 and error c3149
                        gcroot<System::String^> refStr1;

                        MixedClass0()
                        
            {
                            refClass1 
            = gcnew RefClass();
                            refStr1 
            = gcnew System::String("i am a native class mixed some clr members.\n");
                        }

                        
            ~MixedClass0()
                        
            {            
                            delete refClass1;
                            delete refStr1;
                        }


                        
            void PrintSelf()
                        
            {
                            System::Console::WriteLine(
            "my name is MixedClass0");
                            System::Console::WriteLine(refClass1
            ->x);
                            System::Console::WriteLine(refStr1);
                        }

                }
            ;

                
            public class MixedClass1
                
            {
                    
            public:
                        NativeClass nativeClass;
                        
            //RefClass refClass; // error c3265 and error c3149
                        msclr::auto_gcroot<RefClass^> refClass1;

                        std::
            string nativeStr;
                        
            //System::String refStr; // error c3265 and error c3149
                        msclr::auto_gcroot<System::String^> refStr1;

                        MixedClass1()
                        
            {
                            refClass1 
            = gcnew RefClass();
                            refStr1 
            = gcnew System::String("i am a native class with some clr members.\n");
                        }

                        
            ~MixedClass1()
                        
            {
                            
            // no need to delete.
                        }
                    

                        
            void PrintSelf()
                        
            {
                            System::Console::WriteLine(
            "my name is MixedClass1");
                            System::Console::WriteLine(refClass1
            ->x);
                            System::Console::WriteLine(refStr1);
                        }

                }
            ;

                
            public ref class MixedClass2
                
            {
                    
            public:
                        
            //NativeClass nativeClass; // error c4368
                        NativeClass * nativeClass1;
                        RefClass
            ^ refClass; 
                        
                        
            //std::string nativeStr; // error c4368
                        std::string *nativeStr1;
                        System::String
            ^ refStr; //     

                        MixedClass2()
                        
            {
                            nativeClass1 
            = new NativeClass();
                            nativeStr1 
            = new std::string("i am a clr class with some native members.\n");
                        }

                        
            ~MixedClass2()
                        
            {
                            delete nativeClass1;
                            delete nativeStr1;
                        }

                        
            !MixedClass2(){}

                        
            void PrintSelf()
                        
            {
                            System::Console::WriteLine(
            "my name is MixedClass2");
                            std::cout
            <<*(nativeClass1->pX)<<std::endl;
                            std::cout
            <<*nativeStr1<<std::endl;                
                        }

                }
            ;
                
                
            public ref class MixedClass3
                
            {
                    
            public:
                        
            //NativeClass nativeClass; // error c4368
                        CAutoNativePtr<NativeClass> nativeClass1;
                        RefClass
            ^ refClass; 
                        
                        
            //std::string nativeStr; // error c4368
                        CAutoNativePtr<std::string> nativeStr1;
                        System::String
            ^ refStr; //     

                        MixedClass3()
                        
            {
                            nativeClass1 
            = new NativeClass();
                            nativeStr1 
            = new std::string("i am a clr class with some native members.\n");
                        }

                        
            ~MixedClass3(){}
                        
            !MixedClass3(){}

                        
            void PrintSelf()
                        
            {
                            System::Console::WriteLine(
            "my name is MixedClass3");
                            std::cout
            <<*(nativeClass1->pX)<<std::endl;
                            std::cout
            <<*nativeStr1<<std::endl;                
                        }

                }
            ;
            }


            測(cè)試實(shí)例之C#調(diào)用文件:
            using System;
            using System.Collections.Generic;
            using System.Text;

            namespace CsharpTest
            {
                
            class Program
                
            {
                    
            static void Main(string[] args)
                    
            {
                        MixedNativeAndCLIDLL.MixedClass0 mixedClass0 
            = new MixedNativeAndCLIDLL.MixedClass0();
                        
            //mixedClass0.PrintSelf();
                        MixedNativeAndCLIDLL.MixedClass1 mixedClass1 = new MixedNativeAndCLIDLL.MixedClass1();
                        
            //mixedClass1.PrintSelf();
                        MixedNativeAndCLIDLL.MixedClass2 mixedClass2 = new MixedNativeAndCLIDLL.MixedClass2();
                        mixedClass2.PrintSelf();
                        MixedNativeAndCLIDLL.MixedClass3 mixedClass3 
            = new MixedNativeAndCLIDLL.MixedClass3();
                        mixedClass3.PrintSelf();
                    }

                }

            }


            三 代碼下載

            http://m.shnenglu.com/Files/mzty/MixedNativeAndCLITest.rar
            posted on 2008-11-08 13:26 BeyondCN 閱讀(871) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): .NET
            97精品伊人久久久大香线蕉| 热re99久久6国产精品免费| 久久水蜜桃亚洲av无码精品麻豆| 久久精品国产亚洲AV久| 日韩人妻无码精品久久免费一| 丁香狠狠色婷婷久久综合| 久久九九久精品国产| 国内精品伊人久久久久777| 久久久青草久久久青草| 中文成人无码精品久久久不卡 | 久久国产热这里只有精品| 亚洲欧美国产精品专区久久| 精品无码久久久久国产| 久久婷婷色综合一区二区| 狠狠色丁香婷综合久久| 青青草原综合久久大伊人| 亚洲精品高清久久| 人妻少妇久久中文字幕| 国内精品久久久久影院老司| 国产精品99久久久久久董美香| 久久亚洲中文字幕精品有坂深雪| 久久久WWW成人| 久久无码av三级| 2021精品国产综合久久| 东方aⅴ免费观看久久av| 青青草国产97免久久费观看| 久久综合狠狠综合久久激情 | 午夜精品久久久久久毛片| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 国产∨亚洲V天堂无码久久久| 久久乐国产综合亚洲精品| 无码任你躁久久久久久| 国内精品久久久久久久久 | 免费无码国产欧美久久18| 久久天天躁狠狠躁夜夜2020| 久久国产视频99电影| 久久久久无码精品| 亚洲欧美精品一区久久中文字幕 | 国产精品欧美久久久天天影视 | 久久人妻少妇嫩草AV蜜桃| 亚洲欧美精品一区久久中文字幕 |