티스토리 뷰

Piece

From C# Call C++ [Hybrid] Mixing Sample

More Code 2018. 7. 21. 21:42

사용환경 : Visual Studio 2017, Windows 10 x64


C#과 C++을 Mixing해서 코딩하는 방법을 알아보자.


C++ Class를 C#에서 사용하는 예제를 하나 진행해보자.


C++ Class를 만든 후, 그 C++ Class를 사용하는 C++/CLI Class를 만든 다음, C#에서 C++/CLI Class를 사용하는 방식으로 진행하려고 한다.


먼저 Visual Studio에서 “Blank Solution”을 하나 만들자.


Solution 이름은 “Hybrid1”으로 하자.






Hybrid1 Solution에 “Windows Desktop Wizard”로 Visual C++ Project를 하나 추가한다.


Project 이름은 “Native1”으로 하자.






Application type은 “Static Library (.lib)”으로 한다.






Native1 Project에 Class를 하나 추가한다.


이름은 “NativeClass1”로 하자.






NativeClass1에 member function을 하나 추가한다.


이름은 “ShowNative1”로 하자.






“stdafx.h” 헤더파일에 아래 라인을 추가하자.


#include <iostream>



Native1 Project 파일들을 아래와 같이 코딩해준다.


< stdafx.h >

// stdafx.h : include file for standard system include files,

// or project specific include files that are used frequently, but

// are changed infrequently

//

 

#pragma once

 

#include "targetver.h"

 

#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers

 

 

 

// TODO: reference additional headers your program requires here

 

#include <iostream>



< NativeClass1.h >

#pragma once

class NativeClass1

{

public:

    NativeClass1();

    ~NativeClass1();

    void ShowNative1();

};



< NativeClass1.cpp >

#include "stdafx.h"

#include "NativeClass1.h"

 

using namespace std;

 

NativeClass1::NativeClass1()

{

    cout << "You are in NativeClass1 constructor!" << endl;

}

 

 

NativeClass1::~NativeClass1()

{

    cout << "You are in ~NativeClass1 destructor!" << endl;

}

 

 

void NativeClass1::ShowNative1()

{

    cout << "Show me the native way!" << endl;

}



이제 Native1 Project를 Build하자.


Hybrid1\Debug 폴더에 “Native1.lib” 파일이 생성된 것을 확인하자.






이제 Hybrid1 Solution에 C++/CLI Project를 하나 추가하자.

아래 그림처럼 “Add New Project” 화면에서 Visual C++ > CLR > Class Library 순서로 선택한다.

Project 이름은 “Managed1”로 하자.





앞서 작성한 Native1 Project 파일 중에서 “NativeClass1.h” 파일을 include시켜주기 위해서, 아래와 같은 작업이 필요하다.

Managed1 Project > Properties > Configuration Properties > C/C++ > General > Additional Include Directories > <Edit...>

여기서 아래와 같이 “$(SolutionDir)Native1”을 추가해준다.








Solution Explorer에서 Solution ‘Hybrid1’ > Managed1 > References를 마우스 우클릭한 후, “Add Reference”를 선택한다.


그 다음 Projects에서 Native1을 체크한다.






“Managed1.h” 파일 안에 “Class1”이 자동으로 생성되어 있는데, 이 Class의 이름을 “ManagedClass1”으로 바꿔주자.


Managed1 Project의 Managed1.h 파일을 아래와 같이 코딩해주고 Project를 Build하자.


< Managed1.h >

// Managed1.h

 

#pragma once

 

#include <NativeClass1.h>

 

using namespace System;

 

namespace Managed1

{

 

    public ref class ManagedClass1

    {

    public:

        __clrcall ManagedClass1()

        {

            Console::WriteLine("You are in ManagedClass1 constructor!");

            m_NativeClass1 = new NativeClass1();

            if (!m_NativeClass1)

            {

                throw gcnew OutOfMemoryException();

            }

        }

 

        __clrcall ~ManagedClass1()

        {

            if (m_NativeClass1)

            {

                delete m_NativeClass1;

            }

            Console::WriteLine("You are in ~ManagedClass1 destructor!");

        }

 

        __clrcall !ManagedClass1()

        {

            if (m_NativeClass1)

            {

                delete m_NativeClass1;

            }

            Console::WriteLine("You are in !ManagedClass1 destructor!");

        }

 

        void __clrcall ShowManaged1()

        {

            Console::WriteLine("Show me the managed way!");

            m_NativeClass1->ShowNative1();

        }

 

    private:

        NativeClass1 *m_NativeClass1 = nullptr;

    };

}



Managed1.h 파일의 코드 중에서 "__clrcall" calling convention에 관해서는 아래 링크를 참고하기 바란다.

https://blogs.msdn.microsoft.com/abhinaba/2012/11/14/ccli-and-mixed-mode-programming/

https://docs.microsoft.com/en-us/cpp/dotnet/double-thunking-cpp

https://docs.microsoft.com/en-us/cpp/cpp/clrcall



이제 Hybrid1 Solution에 C# Console Project를 하나 추가하자.


C# Console Project의 이름은 “Mixing1”으로 하자.


Mixing1 Project를 “StartUp Project”로 지정해주고, References에 Managed1 Project를 추가해준다.


Program.cs 파일을 아래와 같이 코딩해준다.


< Program.cs >

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace Mixing1

{

class Program

{

  static void Main(string[] args)

  {

    Managed1.ManagedClass1 myClass = new Managed1.ManagedClass1();

    myClass.ShowManaged1();

  }

}

}



모든 Project를 Build하고 실행하면 아래와 같은 결과가 나온다.






출력 결과를 보면 Native C++ 코드와 Managed C++/CLI 코드와 C# 코드가 모두 실행되었음을 알 수 있다.


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함