C# , C++ È¥ÇÕ ÇÁ·Î±×·¡¹Ö 2Àå

4. C#¿¡¼­ C++ È£Ãâ(ÄÜ¼Ö ¸ðµå¿¡¼­ ÄÄÆÄÀÏ)  mix_lang.zip

Æß: www.hanb.co.kr/web/sample/1145/dotnet_chapter3.pdf   (ÇѺû¹Ìµð¾î Ã¥»ùÇÃÀε¥ ¹«½¼ Ã¥ÀÎÁö ¸ð¸§)

Æß: http://blogs.msdn.com/junfeng/archive/2006/05/20/599434.aspx

Æß: Managed Extensions for C++ ±¸¹® ¾÷±×·¹À̵å(VS2003 --> VS2005)

Æß: MSDN CDÀÇ Samples\VC\ManagedExtensions\Interoperability Æú´õÀÇ MCppWrapper ÇÁ·ÎÁ§Æ®

Äָܼðµå·Î »ìÇàÇÏ´Â ¹æ¹ýÀº cmd.exe ½ÇÇàÈÄ vcvars32.bat¸¦ ½ÇÇàÇÏ´Â ¹æ¹ý°ú ½ÃÀÛ ¸Þ´ºÀÇ
Visual Studio .NET Tools > Visual Studio .NET ¸í·É ÇÁ·ÒÇÁÆ®·Î ½ÇÇàÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù.

¹èÄ¡ ÆÄÀÏÀÇ À§Ä¡ C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat

ÆíÇÏ°Ô ºôµå ÇÒ·Á¸é C:\ Æú´õ¿¡ ¹èÄ¡ ÆÄÀÏÀ» ¸¸µé¾î µÎ°í ¹èÄ¡ ÆÄÀÏÀ» ½ÇÇà Çϵµ·Ï ÇÑ´Ù.
¹èÄ¡ ÆÄÀÏ¿¡ ¾Æ·¡¿Í °°ÀÌ ÀÔ·ÂÇÑ´Ù.

"C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat"

Managed C++, VB, C#À¸·Î ÀÌ·ïÁø Vehicle Ŭ·¡½º¸¦ TestDrive¿¡¼­ »ý¼ºÇØ ½ÇÇàÇÑ´Ù.
Vechicle, Car, Plane º°·Î DLLÀ» ¸¸µç´Ù.
.NetÀ¸·Î ¸¸µå´Â °æ¿ì ¸í½ÃÀûÀ¸·Î 󸮽à DllExport ÀÌ·± °Í ÇØÁÙ ÇÊ¿ä°¡ ¾ø³ªº¸´Ù.
Çì´õÆÄÀϵµ ÇÊ¿ä ¾ø°í DLL ÆÄÀϸ¸ ÀÖÀ¸¸é ºôµå°¡ °¡´ÉÇÏ´Ù.

Äڵ忡 ´ëÇÑ º°µµÀÇ ¼³¸íÀº ÇÏÁö ¾Ê°Ú´Ù.

//vehicle.cpp

#using <mscorlib.dll>

using namespace System;

 

public __gc __interface ISteering

{

    void TurnLeft();

    void TurnRight();

} ;

 

public __gc class Vehicle : public ISteering

{

public:

    virtual void TurnLeft()

    {

        Console::WriteLine("Vehicle turns left.");

    }

 

    virtual void TurnRight()

    {

        Console::WriteLine("Vehicle turn right.");

    }

 

    virtual void ApplyBrakes() = 0;

} ;

//car.vb

Imports System

 

Public Class Car

    Inherits Vehicle

 

    Overrides Public Sub TurnLeft()

        Console.WriteLine("Car turns left.")

    End Sub

 

    Overrides Public Sub TurnRight()

        Console.WriteLine("Car turns right.")

    End Sub

 

    Overrides Public Sub ApplyBrakes()

        Console.WriteLine("Car trying to stop.")

        throw new Exception("Brake failure!")

    End Sub

End Class

//plane.cs

using System;

 

public class Plane : Vehicle

{

    override public void TurnLeft()

    {

        Console.WriteLine("Plane turns left.");

    }

 

    override public void TurnRight()

    {

        Console.WriteLine("Plane turns right.");

    }

 

    override public void ApplyBrakes()

    {

        Console.WriteLine("Air brakes being used.");

    }

}

//drive.cs

using System;

 

class TestDrive

{

    public static void Main()

    {

        Vehicle v; // Vehicle ÀÇ ÂüÁ¶

 

        try

        {

            Plane p = new Plane();

            v = p;

            v.TurnLeft( ) ;

            v.ApplyBrakes( ) ;

            Car c = new Car();

            v = c;

            v.TurnLeft( ) ;

            v.ApplyBrakes(); // ¿¹¿Ü

        }

 

        catch(Exception e)

        {

            Console.WriteLine( e.ToString( ));

        }

    }

}

ºôµå ¹æ¹ýÀº

cmd.bat ½ÇÇà: Äĸǵå ȯ°æÀ¸·Î ÁøÀÔ°ú µ¿½Ã¿¡ vcvars32.bat¸¦ ½ÇÇàÇÏ¿© Äָܼðµå¿¡¼­ ºôµå °¡´ÉÇϵµ·Ï ȯ°æÀ» ¸¸µç´Ù.

build.bat ½ÇÇà

build.bat  ÆÄÀÏ

cl /CLR /c vehicle.cpp
link  -dll /out:vehicle.dll /NOENTRY vehicle.obj /INCLUDE:__DllMainCRTStartup@12

REM VS2005ÀÇ °æ¿ì link  -dll /out:vehicle.dll /NOENTRY vehicle.obj

vbc /r:vehicle.dll /t:library /out:car.dll car.vb
csc /r:vehicle.dll /t:library /out:plane.dll plane.cs
csc /r:vehicle.dll;car.dll;plane.dll /t:exe /out:drive.exe drive.cs

ºñÁê¾ó ½ºÆ©µð¿À 2003ÀÇ °æ¿ì /INCLUDE:__DllMainCRTStartup@12 ºüÁö¸é DllMainÀ» ãÁö ¸øÇÑ´Ù.
ºñÁê¾ó ½ºÆ©µð¿À 2005ÀÇ °æ¿ì´Â /INCLUDE:__DllMainCRTStartup@12 ÀÌ ±¸¹®ÀÌ ¾Æ¸¶ ÇÊ¿ä ¾øÀ» °ÍÀÌ´Ù.

½ÇÇà °á°ú

Plane turns left.
Air brakes being used.
Car turns left.
Car trying to stop.
System.Exception: Brake failure!
   at Car.ApplyBrakes()
   at TestDrive.Main()

 

5. C#¿¡¼­ C++ È£Ãâ(ÅëÇÕ È¯°æ¿¡¼­ ÄÄÆÄÀÏ1) mix_lang_ide1.zip  

csc ¿É¼Ç:

/reference:<file list> ÁöÁ¤ÇÑ ¾î¼Àºí¸® ÆÄÀÏ¿¡¼­ ¸ÞŸµ¥ÀÌÅ͸¦ ÂüÁ¶ÇÑ´Ù. <¾à½Ä: /r>
/target:exe            ÄÜ¼Ö ½ÇÇà ÆÄÀÏÀ» ºôµåÇÕ´Ï´Ù<±âº»°ª>. <¾à½Ä: /t:exe>
/out:<file>            Ãâ·Â ÆÄÀÏ À̸§ÀÔ´Ï´Ù<±âº»°ª: ÁÖ Å¬·¡½º°¡ ÀÖ´Â ÆÄÀÏÀÇ ±âº» À̸§ ¶Ç´Â ù° ÆÄÀÏ>

mix_lang_ide1.zip ¿¹Á¦´Â dirve.cs¿¡¼­ dll ÆÄÀϸ¸À¸·Î ºôµå, ½ÇÇàÀÌ °¡´ÉÇÑÁö Å×½ºÆ® ÇÒ·Á°í ¸¸µé¾ú´Ù.
DLLÀ» ¾Ë·ÁÁÖ±â À§Çؼ­ ¸í·É ¸ðµå¿¡¼­´Â /rÀ» ÅëÇÕ ¸ðµå¿¡¼­´Â ÂüÁ¶ Ãß°¡¸¦ ÅëÇؼ­ °¡´ÉÇÏ´Ù.
C# ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé°í car.dll, plane.dll, vehicle.dllÀ» ÂüÁ¶ Ãß°¡ÇÑ´Ù.

ÅëÇÕ È¯°æ¿¡¼­ DLL ÂüÁ¶ Ãß°¡:
ÇØ´ç ÇÁ·ÎÁ§Æ®·Î À̵¿ --> ÂüÁ¶¿¡¼­ ¿ÞÂÊ ¹öÆ° Ŭ¸¯ --> ÂüÁ¶ Ãß°¡ --> ÇÁ·ÎÁ§Æ® ÅÇÀ¸·Î --> ÂüÁ¶ÇÏ´Â ÇÁ·ÎÁ§Æ® ´õºí Ŭ¸¯

 

6. C#¿¡¼­ C++ È£Ãâ(ÅëÇÕ È¯°æ¿¡¼­ ÄÄÆÄÀÏ2) mix_lang_ide2.zip

ÅëÇÕ È¯°æ¿¡¼­ DLLÀ» ¸¸µé°í ÀÌ¿ëÇÏ´Â ºñÁê¾ó ½ºÆ©µð¿À ÇÁ·ÎÁ§Æ® »ý¼º ¹ý¿¡ ´ëÇؼ­ ¼³¸íÇÑ´Ù.
4°³ÀÇ ÇÁ·ÎÁ§Æ® »ý¼ºÀ» ÇÏ°Ú´Ù.

vehicle ÇÁ·ÎÁ§Æ®(Managed DLL)
car ÇÁ·ÎÁ§Æ® (ºñÁê¾ó º£ÀÌÁ÷ DLL)
plane ÇÁ·ÎÁ§Æ® (C# DLL)
main ÇÁ·ÎÁ§Æ® (C# exe)

 

vehicle ÇÁ·ÎÁ§Æ®(Managed DLL)

»õ ÇÁ·ÎÁ§Æ® Ãß°¡ --> Visual C++ ÇÁ·ÎÁ§Æ® --> Win32 ÇÁ·ÎÁ§Æ® --> (ÀÀ¿ë ÇÁ·Î±×·¥ Á¾·ù)DLL, (Ãß°¡ ¿É¼Ç)ºóÇÁ·ÎÁ§Æ®
¼Ó¼º --> ±¸¼º ¼Ó¼º --> ÀÏ¹Ý --> Managed Extension »ç¿ë --> ¿¹
/NOENTRY, __DllMainCRTStartup@12 Ãß°¡ (ÀÌ µÑÀ» Ãß°¡ ÇÏÁö ¾ÊÀ¸¸é ¸µÅ© ¿¡·¯ LNK4243ÀÌ ¹ß»ýÇÑ´Ù.)

[Æß]Managed Extensions for C++ DLL ÇÁ·ÎÁ§Æ®¸¦ ºôµåÇÒ ¶§ ¸µÄ¿ °æ°í°¡ ¹ß»ýÇÑ´Ù : ÀÌ ¹®Á¦´Â VS 2003¸¸ ¹ß»ýÇÏ´Â µí

LINK : warning LNK4243: /clrÀ» »ç¿ëÇÏ¿© ÄÄÆÄÀÏµÈ °³Ã¼¸¦ Æ÷ÇÔÇÑ DLLÀÌ /NOENTRY¿Í ¸µÅ©µÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù. À̹ÌÁö°¡ ¿Ã¹Ù¸£°Ô ½ÇÇàµÇÁö ¾ÊÀ» ¼öµµ ÀÖ½À´Ï´Ù.

Managed ExManaged Extensions for C++ ·Î ¸¸µç DLLÀÇ À§ÀÇ ¸µÅ© ¿¡·¯°¡ ¹ß»ýÇÑ´Ù.

ÇØ°á ¹æ¹ý : °ü¸®µÇ´Â DLLÀÇ ÁøÀÔÁ¡ Á¦°Å

1. /NOENTRY·Î ¿¬°áÇÕ´Ï´Ù.
¼Ö·ç¼Ç Ž»ö±â¿¡¼­ ÇÁ·ÎÁ§Æ® ³ëµå¸¦ ¸¶¿ì½º ¿À¸¥ÂÊ ´ÜÃß·Î ´©¸£°í ¼Ó¼ºÀ» ´©¸¨´Ï´Ù.
¼Ó¼º ÆäÀÌÁö ´ëÈ­ »óÀÚ¿¡¼­ ±¸¼º¼Ó¼º --> ¸µÄ¿ --> ¸í·É --> Ãß°¡ ¿É¼Ç¿¡ /NOENTRY¸¦ Ãß°¡ÇÕ´Ï´Ù.

2. msvcrt.lib¸¦ ¿¬°áÇÕ´Ï´Ù.
¼Ó¼º ÆäÀÌÁö ´ëÈ­ »óÀÚ¿¡¼­ ±¸¼º¼Ó¼º --> ¸µÄ¿ --> ÀÔ·Â --> Ãß°¡ Á¾¼Ó¼º¿¡ msvcrt.lib¸¦  Ãß°¡ÇÕ´Ï´Ù.

3. nochkclr.obj¸¦ Á¦°ÅÇÕ´Ï´Ù.
¼Ó¼º ÆäÀÌÁö ´ëÈ­ »óÀÚ¿¡¼­ ±¸¼º¼Ó¼º --> ¸µÄ¿ --> ÀÔ·Â --> Ãß°¡ Á¾¼Ó¼º¿¡¼­ nochkclr.obj¸¦ Á¦°ÅÇÕ´Ï´Ù.

4. CRT¿¡ ¿¬°áÇÕ´Ï´Ù.
¼Ó¼º ÆäÀÌÁö ´ëÈ­ »óÀÚ¿¡¼­ ±¸¼º¼Ó¼º --> ¸µÄ¿ --> ÀԷ --> °­Á¦ ±âÈ£ ÂüÁ¶¿¡  __DllMainCRTStartup@12¸¦ Ãß°¡ÇÕ´Ï´Ù.

¸í·É ÇÁ·ÒÇÁÆ®ÀÇ °æ¿ì
LINK /NOENTRY msvcrt.lib /NODEFAULTLIB:nochkclr.obj /INCLUDE:__DllMainCRTStartup@12

 

car ÇÁ·ÎÁ§Æ® (ºñÁê¾ó º£ÀÌÁ÷ DLL)

»õ ÇÁ·ÎÁ§Æ® Ãß°¡ --> ÅÛÇø´¿¡¼­ Ŭ·¡½º ¶óÀ̺귯¸® ¼±Åà --> »ý¼ºµÈ ¼Ò½º »èÁ¦
vehicle ÂüÁ¶ Ãß°¡
Car ¼Ó¼º : °ø¿ë ¼Ó¼º --> ·çÆ® ³×ÀÓ½ºÆäÀ̽º --> car »èÁ¦
·çÆ® ³×ÀÓ½ºÆäÀ̽º¸¦ »èÁ¦ÇÏÁö ¾ÊÀ¸¸é Ŭ·¡½º car»óÀ§·Î ³×ÀÓ½ºÆäÀ̽º car°¡ Á¸ÀçÇÏ°Ô µÈ´Ù. ±×·¡¼­ ¾Æ·¡ÀÇ ¿¡·¯°¡ ¶á´Ù.
'Car' Çü½Ä ¶Ç´Â ³×ÀÓ½ºÆäÀ̽º¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù. using Áö½Ã¹® ¶Ç´Â ¾î¼Àºí¸® ÂüÁ¶°¡ ÀÖ´ÂÁö È®ÀÎÇϽʽÿÀ.

 

plane ÇÁ·ÎÁ§Æ® (C# DLL)

»õ ÇÁ·ÎÁ§Æ® Ãß°¡ --> ÅÛÇø´¿¡¼­ ºó ÇÁ·ÎÁ§Æ® ¼±ÅÃ
DLL ÇÁ·ÎÁ§Æ®·Î ¹Ù²Ù±â: ¼Ó¼º --> °ø¿ë ¼Ó¼º --> ÀÏ¹Ý --> ÀÀ¿ëÇÁ·Î±×·¥ --> Ãâ·Â Çü½Ä --> Ŭ·¡½º ¶óÀ̺귯¸®
vehicle ÂüÁ¶ Ãß°¡

 

main ÇÁ·ÎÁ§Æ® (C# exe)

»õ ÇÁ·ÎÁ§Æ® Ãß°¡ --> ÅÛÇø´¿¡¼­ ºó ÇÁ·ÎÁ§Æ® ¼±ÅÃ
vehicle, car, plane ÂüÁ¶ Ãß°¡