• <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


            一 混合類

            所謂混合類是指CLI/C++中native的Class中可以包含CLR對象,CLR的class也可以包含Naitve的對象。

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


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

            二 實例

             高手的CAutoNativePtr類:

            /***
                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;
                }

            }
            ;

            測試實例之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#調用文件:
            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://www.shnenglu.com/Files/mzty/MixedNativeAndCLITest.rar
            posted on 2008-11-08 13:26 BeyondCN 閱讀(870) 評論(0)  編輯 收藏 引用 所屬分類: .NET
            久久w5ww成w人免费| 久久精品中文字幕一区| 久久妇女高潮几次MBA| 香蕉aa三级久久毛片| 亚洲国产成人久久精品99| 久久久噜噜噜久久| 亚洲国产精品18久久久久久| 色欲综合久久躁天天躁蜜桃| 国内精品久久人妻互换| 欧美亚洲另类久久综合| 色综合合久久天天给综看| 亚洲av伊人久久综合密臀性色| 久久er热视频在这里精品| 色狠狠久久综合网| 久久九九有精品国产23百花影院| 青青草国产97免久久费观看| 久久综合综合久久综合| 久久婷婷色综合一区二区| 久久亚洲中文字幕精品有坂深雪 | 久久久99精品成人片中文字幕| 人人狠狠综合88综合久久| 国产91久久精品一区二区| 日韩人妻无码一区二区三区久久99 | 欧美亚洲另类久久综合| 人妻丰满AV无码久久不卡| 精品久久综合1区2区3区激情| 色综合久久无码中文字幕| 青春久久| 性做久久久久久久久老女人| 一本久久久久久久| 国产成年无码久久久久毛片| 亚洲综合熟女久久久30p| 综合久久给合久久狠狠狠97色| 久久精品国产久精国产| 国内精品久久久久| 久久久女人与动物群交毛片| 狠狠色丁香久久婷婷综合_中| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久婷婷综合中文字幕| 亚洲精品无码久久久久sm| 午夜精品久久久内射近拍高清|