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

7. C#¿¡¼­ C++ È£Ãâ(³×ÀÌƼºê C++)dll_csharp.zip

Æß: (MSDN)C#¿¡¼­ »ç¿ëÇϱâ À§ÇØ ³×ÀÌƼºê Ŭ·¡½º ·¡ÇÎ

ÀÌÀå¿¡¼­´Â Native C++À» ¾î¶»°Ô ·¡ÇÎÇؼ­ C#¿¡¼­ ÀÌ¿ëÇÏ°í ÀÖ´ÂÁö ¾Ë¾Æº»´Ù.

CUnmangedClass : Native C++ , DLL À̸§Àº unmanagedclass.dll
CUnmanagedClass´Â Add(), Sub(), GetNum() ¸Þ½îµå·Î ´õÇϱâ, »©±â, °ª ¾ò±â ±â´ÉÀ» ÇÑ´Ù.

CManagedClass : Managed C++, DLL À̸§Àº ManagedClass.dll
CUnmanagedClass Ŭ·¡½º¸¦ C#¿¡¼­ È£Ãâ °¡´É Çϵµ·Ï ·¡ÇÎÇÑ´Ù.

MainClass : C#, exe ÆÄÀÏ
CUnmanagedClass Ŭ·¡½º¸¦ ÀÌ¿ëÇØ °ªÀ» °è»êÇÑ´Ù.

ÇÁ·ÎÁ§Æ®¸¦ ¸¸µå´Â ÀÚ¼¼ÇÑ ¼³¸íÀº 2ÀåÀ» Âü°í ÇÑ´Ù.

 

CUnmanagedClass : Native C++ DLL ¸¸µé±â

ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé°í "ºôµå À̺¥Æ® --> ºôµå ÈÄ À̺¥Æ®"¿¡ unmanagedclass.lib, unmanagedclass.dllÀ» º¹»ç Çϵµ·Ï ÇÑ´Ù.

copy  "$(SolutionDir)$(OutDir)\$(TargetName).lib"  "..\ManagedClass\$(TargetName).lib"
copy  "$(SolutionDir)$(OutDir)\$(TargetName).dll"  "..\main\bin\$(OutDir)\$(TargetName).dll"

#ifdef DLL_EXPORT

   #define DLL_DECLSPEC  __declspec(dllexport)   

#else

   #define DLL_DECLSPEC  __declspec(dllimport)   

#endif

 

 

class DLL_DECLSPEC    CUnmanagedClass

{

public:

    CUnmanagedClass();

    ~CUnmanagedClass();

    int        Add(int num);

    int        Sub(int num);

    int        GetNum();

 

private:

    int        m_iSum;

};

//unmanagedclass.cpp

#define DLL_EXPORT

#include "unmanagedclass.h"

 

CUnmanagedClass::CUnmanagedClass()

{

    m_iSum = 0;

}

//--------------------------------------------------------------------------------

CUnmanagedClass::~CUnmanagedClass()

{

 

}

//--------------------------------------------------------------------------------

int    CUnmanagedClass::Add(int num)

{

    return (m_iSum += num);

}

//--------------------------------------------------------------------------------

int    CUnmanagedClass::Sub(int num)

{

    return (m_iSum -= num);

}

//--------------------------------------------------------------------------------

int CUnmanagedClass::GetNum()

{

    return m_iSum;

}

 

CManagedClass : Managed C++

__gc·Î ¼±¾ðµÈ Ŭ·¡½º´Â Unmanaged Ŭ·¡½º¸¦ Æ÷ÀÎÅÍ »óÅÂÀÇ ¸â¹ö º¯¼ö·Î¸¸ °¡Áú¼ö ÀÖ´Ù.
CUnmanagedClass Ŭ·¡½º¸¦ m_pUnmanaged Æ÷ÀÎÅÍ·Î Á¤ÀÇÇÑ´Ù.

ÇÁ·ÎÁ§Æ®¸¦ ¸¸µçÈÄ VS2003¿¡¼­´Â º°µµ·Î 3°¡Áö »çÇ×À» Ãß°¡ÇÑ´Ù.
/NOENTRY, __DllMainCRTStartup@12, msvcrt.lib¸¦ Ãß°¡ÇÑ´Ù.
msvcrt.lib¸¦ Ãß°¡ ÇÏÁö ¾ÊÀ¸¸é ÄÚµå »ý¼ºÀÌ µÇ´õ¶óµµ ½ÇÇà½Ã CUnmanagedClass¸¦ È£ÃâÇÒ¶§ StackOverflow°¡ ÀϾ´Ù.

#using <mscorlib.dll>

using namespace System;

 

#include "../unmanagedclass/unmanagedclass.h"

 

#pragma comment(lib, "unmanagedclass.lib")

 

public __gc class CManagedClass

{

public:

    CManagedClass();

    ~CManagedClass();

    int        Add(int num);

    int        Sub(int num);

    int        GetNum();

 

private:

    CUnmanagedClass * m_pUnmanaged;

};

 

//-----------------------------------------------------------------------------------------------------------------

CManagedClass::CManagedClass()

{

    m_pUnmanaged = new CUnmanagedClass();

}

//-----------------------------------------------------------------------------------------------------------------

CManagedClass::~CManagedClass()

{

    delete m_pUnmanaged;

}

//-----------------------------------------------------------------------------------------------------------------

int CManagedClass::Add(int num)

{

    return m_pUnmanaged->Add(num);

}

//-----------------------------------------------------------------------------------------------------------------

int CManagedClass::Sub(int num)

{

    return m_pUnmanaged->Sub(num);

}

//-----------------------------------------------------------------------------------------------------------------

int CManagedClass::GetNum()

{

    return m_pUnmanaged->GetNum();

}

//-----------------------------------------------------------------------------------------------------------------

 

MainClass : C#

¼Ö·ç¼Ç Ž»ö±âÀÇ ÂüÁ¶¿¡ ManagedClass¸¦ Ãß°¡ÇÑ´Ù.
°á°ú °ªÀº 1ÀÌ´Ù.

//main.cs

using System;

 

class MainClass

{

    public static void Main()

    {

        CManagedClass test = new CManagedClass();

        test.Add(1);

        test.Add(2);

        test.Add(3);

        test.Sub(5);

 

        Console.WriteLine("Value is {0}", test.GetNum());

    }

}