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)
»õ ÇÁ·ÎÁ§Æ® Ãß°¡ --> 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 ÂüÁ¶ Ãß°¡
|