You are on page 1of 17

Managed C++

Tomá š M a t ou še k
&
L a d i s l a v P r oše k

tmd.havit.cz/teaching/csharp.htm

Advanced C # and . N E T p r o g r am m i ng
Introduction
• C + + c r e a t e d b y B ja r n e S t r o u s t r u p ( B e ll L a b s ) in 1 9 8 3
• s t a t i c a l l y t y p e d m u l t i -p a r a d i g m l a n g u a g e s u p p o r t i n g
– p r o c e d u r a l p r o g r a m m in g
– o b j e c t -o r i e n t e d p r o g r a m m i n g
– g e n e r ic p r o g r a m m in g
• t h e la n g u a g e o f 1 9 9 0 s

• C + + in t h e . N E T w o r ld
– C ++ w i t h m a n a g e d e x t e n s i o n s ( M C ++)
• in c lu d e d in V is u a l S t u d io . N E T 2 0 0 2 a n d 2 0 0 3
– C ++/C L I
• in c lu d e d in t h e f o r t h c o m in g V is u a l S t u d io . N E T 2 0 0 5 ( W h id b e y )
• t o b e s t a n d a r d iz e d b y E C M A
– d e s i g n e d b y C ++ g u r u s w o r k i n g f o r M i c r o s o f t
• S t a n le y L ip p m a n n , H e r b S u t t e r

Advanced C # and . N E T p r o g r am m i ng
F e a ture s
+ p e rfo rm a n c e
– t h e o n ly V S . N E T c o m p ile r w it h a f u ll o p t im iz e r b a c k e n d
• generates o ptimized I L
– f u ll c o n t r o l o f e x p e n s iv e o p e r a t io n s lik e b o x in g , c a s t in g , . . .
+ m ix in g m a n a g e d a n d u n m a n a g e d c o d e
– l e v e r a g e s l e g a c y C + + c o d e – “i n c r e m e n t a l ” p o r t i n g
– s e a m le s s a c c e s s t o u n m a n a g e d lib r a r ie s ( D L L s a s w e ll a s s t a t ic a lly lin k e d )
– d e v e lo p in g c o m p o n e n t s c o n s u m a b le b y u n m a n a g e d c o d e
+ m u l t i -p a r a d i g m d e s ig n
– m ix p r o c e d u r a l, o b je c t o r ie n t e d a n d g e n e r ic p r o g r a m m in g

– h a r d t o p r o d u c e v e r if ia b le a s s e m b ly
– m ix e d a s s e m b lie s o n ly u s a b le in M S W in d o w s
– p o o r ID E s u p p o rt

M C ++ ( C ++/C L I ) i s t h e l a n g u a g e o f c h o i c e i f y o u w a n t f u l l c o n t r o l o f
t h e .N E T e n v i r o n m e n t a n d /o r i n t e r o p e r a b i l i t y w i t h u n m a n a g e d c o d e .
Advanced C # and . N E T p r o g r am m i ng
C + + w ith M a na g e d E x te ns ions
• /c l r c o m p i l e r s w i t c h e s s e n t i a l l y c h a n g e s t h e t a r g e t
p la t f o r m f r o m n a t iv e ( x 8 6 ) t o C L R
– g e n e r a t e s m a n a g e d c o d e – M S I L in s t e a d o f n a t iv e
– h o w e v e r , u n le s s e x p lic it ly s t a t e d o t h e r w is e , d a t a is u n m a n a g e d !

• t a r g e t p la t f o r m c a n a l s o b e s e l e c t e d p e r -f u n c t i o n
#pragma managed
#pragma unmanaged

• s o m e c o n s t r u c t s p r e v e n t f u n c t io n s f r o m b e in g m a n a g e d
– p a r a m e t e r lis t t e r m in a t e d w it h e llip s is ( ...)

– i n l i n e a s s e m b l e r ( __asm)
– l o n g j u m p s ( setjmp/longjmp)
– ...

Advanced C # and . N E T p r o g r am m i ng
It J us t W ork s
• “I t J u s t W o r k s ” ( I J W )
– no mo dif icatio ns are necessary to reb u il d an arb itrary C o r C + + appl icatio n f o r .N E T
– managed ↔ u nmanaged transitio n thu nk s are au to matical l y generated b y the l ink er

– ex ampl e: cal l ing getch C R T f u nctio n f ro m managed co de:


call int32
modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl)
getch()

– the I J W thu nk f o r getch:


.method public static pinvokeimpl(/* No map */) int32
modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl)
getch() native unmanaged preservesig
{
.custom instance void
[mscorlib]System.Security.SuppressUnmanagedCodeSecurityAttribute::.cto
r() = ( 01 00 00 00 )
// Embedded native code
// Disassembly of native methods is not supported.
// Managed TargetRVA = 0x0001B390
} // end of method 'Global Functions'::getch

Advanced C # and . N E T p r o g r am m i ng
M ix e d C + +

Advanced C # and . N E T p r o g r am m i ng
M a na g e d D a ta
• d e c la r in g m a n a g e d d a t a :
// delegate
__delegate void Handler(Object *arg);

// managed structure
public __value class B
{
public:
__event Handler *handler;
};

// managed interface
public __gc __interface I
{
Type *Foo();
};

// managed class
public __gc class A : public I
{
public:
Type *Foo()
{ return DateTime::Now.DayOfWeek == DayOfWeek::Sunday ? __typeof(B) : NULL; }

// read-write property
__property String *get_Name() { return S"A"; }
__property void set_Name(String *name) { }
};

Advanced C # and . N E T p r o g r am m i ng
_ _ g c a nd _ _ nog c k e y w ords
• t e lls t h e c o m p ile r w h e t h e r t h e la n g u a g e c o n s t r u c t s h o u ld b e u n d e r s t o o d a s
m a n a g e d o r u n m a n a g e d
• c a n b e o m i t t e d i f i t i s c l e a r f r o m t h e c o n t e x t , __nogc i s d e f a u l t i n m o s t c a s e s

• c la s s d e c la r a t io n :
public __gc class A { ... };

• r e f e r e n c e d e c la r a t io n :
A __gc *a;

• c la s s in s t a n t ia t io n :
a = __gc new A();

• a r r a y d e c la r a t io n :
A __gc *ar __gc[]; // managed array of managed references

• a r r a y in s t a n t ia t io n :
ar = __gc new A __gc * __gc[5]; // all these __gc’s can be omitted ☺

• n o t e : ja g g e d a r r a y s a r e n o t s u p p o r t e d in M C + +

Advanced C # and . N E T p r o g r am m i ng
R e f e re nce s a nd P ointe rs
• i n M C + + , a s t e r i s k ( * ) i s u s e d t o d e c l a r e /d e r e f e r e n c e
– m a n a g e d re fe re n c e s :
String *s = new String(“hello”);
– m a n a g e d ( a k a in t e r io r ) p o in t e r s :
int __gc *p = &x->field;
– u n m a n a g e d p o in t e r s :
int *q = new int[5];

• t h e s a m e s y n t a x f o r q u it e d if f e r e n t in s t r u m e n t s
– c o n fu s in g

Advanced C # and . N E T p r o g r am m i ng
T y p e ca s ting a nd ( U n) b ox ing
• a s s u m e t h e s e d e c la r a t io n s :
Object *x;
A *a;
int i;

M C + + C # IL
a = (A *)x; // deprecated - assignment – u nv er if iab l e!

a = static_cast<A *>(x); - assignment – u nv er if iab l e!

a = dynamic_cast<A *>(x); a = x as A; isinst A

a = __try_cast<A *>(x); a = (A)x; castclass A

a = reinterpret_cast<A *>(x); - assignment – u nv er if iab l e!

x = __box(i); x = i; box System.Int32

i = *static_cast<__box int *>(x); i = (int)x; unbox System.Int32


ldind.i4

Advanced C # and . N E T p r o g r am m i ng
L oa de r L ock B ug
• lo a d in g D L L s t h a t c o n t a in b o t h m a n a g e d a n d u n m a n a g e d c o d e ( m ix e d
D L L s ) m a y c a u s e d e a d lo c k
– r e c o g n iz e d a s a b u g b y M ic r o s o f t
– c e r t a in r e s t r ic t io n s r e la t e d t o d y n a m ic lib r a r y lo a d in g m a y b e v io la t e d b y
e x e c u t in g m a n a g e d c o d e w it h in D llM a in
• w hich happens even if no D l l M ain is ex pl icitl y su ppl ied b y the pro grammer

• t h e r e is c u r r e n t ly n o u lt im a t e s o lu t io n , o n ly a p a r t ia l w o r k a r o u n d t h a t
m in im iz e s t h e r is k
– u s e t h e / n o e n t r y lin k e r s w it c h t o c o m p le t e ly d is a b le D llM a in
– p e r f o r m t h e in it ia liz a t io n t a s k s ( C R T in it ia liz a t io n in p a r t ic u la r ) m a n u a lly

• s h o u ld b e s o lv e d in W h id b e y

• m o r e in f o r m a t io n
– “M ix ed D L L L o ading P ro b l em” M S D N articl e
– “L ink er W arnings W hen Y o u B u il d M anaged E x tensio ns f o r C + + D L L P ro j ects”
k no w l edge b ase articl e ( K B 8 1 4 4 7 2 )
Advanced C # and . N E T p r o g r am m i ng
C + + / C L I
• in W h id b e y t h e la n g u a g e is r e d e s ig n e d
– n e w n a m e : C ++/C L I ( a k a V e r s io n 2 )
– n e w s y n ta x (n o m o re _ _ g c )
– m o r e s y n t a c t ic s u g a r ( f o r e a c h , im p lic it b o x in g )
– n e w d e s t r u c t o r /f i n a l i z e r s e m a n t ic s
– n o lo a d e r lo c k b u g ☺
– g e n e r ic s
– ...

• t h e /c l r c o m p i l e r s w i t c h i s e x t e n d e d
– /c l r : o l d S y n t a x – l e g a c y s u p p o r t f o r M C ++ s y n t a x
– /c l r : p u r e – p r o d u c e s m a n a g e d ( M S I L o n l y ) a s s e m b l y
• IJ W n o t a llo w e d , p u r e M S I L C R T u s e d in s t e a d ( m s v c m 8 0 . d ll)
– /c l r : s a f e – p r o d u c e s m a n a g e d a n d v e r i f i a b l e a s s e m b l y

Advanced C # and . N E T p r o g r am m i ng
C + + / C L I

Advanced C # and . N E T p r o g r am m i ng
C + + / C L I

Advanced C # and . N E T p r o g r am m i ng
C + + / C L I

Advanced C # and . N E T p r o g r am m i ng
C + + / C L I S y nta x
• “M a n a g e d d a t a ” s l i d e r e w r i t t e n i n t h e n e w s y n ta x :
// delegate
delegate void Handler(Object ^arg);

// managed structure
public value class B
{
public:
event Handler ^handler;
};

// managed interface
public interface class I
{
Type ^Foo();
};

// managed class
public ref class A : I
{
public:
Type ^Foo()
{ return DateTime::Now.DayOfWeek == DayOfWeek::Sunday ? typeid<B> : nullptr; }

// read-write property
property String ^Name
{ String ^get() { return "A"; } void set(String ^name) { } }
};

Advanced C # and . N E T p r o g r am m i ng
C + + / C L I S y nta x ( cont. )
• managed ref erences, G C al l o catio n:
String ^s = gcnew String("hello");
• managed po inters:
interior_ptr<int> p = &x->field;
• u nmanaged po inters:
int *q = new int[5];
• array decl aratio n:
array<A ^> ^ar; // managed array of managed references
• array instantiatio n:
ar = gcnew array<A ^>(5);
• j agged array decl aratio n:
array<array<A ^> ^> ^arr;
• generic ty pes:
generic<typename T> where T : IComparable
public ref class Gen
{
void Foo(T t) { }
// ...
};

Advanced C # and . N E T p r o g r am m i ng

You might also like