[.Net] 3'rd party library๋ฅผ C++/CLI๋ก C#์์ ์ฌ์ฉํ๊ธฐ ์ํ dll ๋ง๋ค๊ธฐ (์์ ํฌํจ)
์๊ฐ
๋ณธ๋ฌธ์ ์ฝ๊ธฐ ์ ์ C++/CLI๊ฐ ๋ฌด์์ธ์ง ์ดํดํ๋ฉด ์์ ์ฝ๋๋ฅผ ๋ฐ๋ผ ํ๋๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋๋ถ์ด ๊ธฐ์ด ์์ ๋ฅผ ๋ฐ๋ผ ํด ๋ณด๋ฉด ๋ณธ๋ฌธ์ ์ดํดํ๋๋ฐ ๋์์ด ๋ฉ๋๋ค.
[.Net] C++/CLI๋ก C#์์ ์ฌ์ฉํ๊ธฐ ์ํ dll ๋ง๋ค๊ธฐ (์์ ํฌํจ)
3'rd party library?
๋จธ์ ๋น์ ์ ๊ณ์์๋ ์์ ์ฒ๋ฆฌ๊ฐ ํ์์ธ๋ฐ์. ์์ ์ฒ๋ฆฌ๋ฅผ ์ํ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ ๊ฐ๋ฐํ์ฌ ์ฌ์ฉํ๊ธฐ๋ ํ์ง๋ง ๋๋ถ๋ถ์ ์์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ๋งคํ์ฌ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋ฐ ์๊ฐ ์ ์ฝ๊ณผ ์ฑ๋ฅ ๋๋ฌธ์ด์ฃ . ๊ทธ๋ฐ๋ฐ ์์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ํํฐ๋ง ๋ฐ ๊ฒ์ฌ ๋ก์ง์ ์ด๋ป๊ฒ ์์ฑํ๋์ ๋ฐ๋ผ ๊ฒ์ฌ ์ฑ๋ฅ์ด ๋ฌ๋ผ์ง๋๋ฐ์. ์ด๊ฒ๋ ๋ ธํ์ฐ์ด๋ฉฐ ๊ธฐ์ ๋ ฅ์ธ๋ฐ C#์์ ๋ฐ๋ก ๊ตฌํํ๋ฉด ์ด ๋ก์ง์ด ๋ ธ์ถ๋๊ฒ ์ฃ ? ๊ทธ๋์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด๋ Wrapping ์์ ์ ํ์๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค. ์ด๋ฒ ์์ ์์๋ Euresys์ Open eVision์ ์ด์ฉํ Wrapping class code๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์์ ์ฝ๋๋ dll ์์ฑ ๋ฐฉ๋ฒ ๋ณ๋ก ๋ง์ง๋ง ๋ถ๋ถ์ ์ฒจ๋ถํ์ต๋๋ค.
3'rd party library์ .Net API dll์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
์์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ณดํต C++ ๋ฐ C#์ฉ dll์ ์ ๊ณตํฉ๋๋ค. ์์๋ก Euresys Open eVision์ C#์ฉ dll์ ์ฌ์ฉํ์ฌ ๋ช ๊ฐ์ง ํํฐ๋ฅผ ์ ์ฉํ ํ ๋ธ๋(Blob)์ ์ํํ๋ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ๋ฌธ์ ์ ๋ง ๋ณด์ฌ๋๋ฆฌ๋ ๊ฒ์ด๋ฏ๋ก ๋ฐ๋ก ์์ ํ์ผ์ ๋ง๋ค์ง ์๊ฒ ์ต๋๋ค.
์์ค ์ฝ๋๋ ๋์ถฉ ํํฐ ๋ช ๊ฐ๋ฅผ ์ฐ๋ฌ์ ์ํํ๊ณ Blob์ ์ํํ๋๋ก ์์ฑํ์ต๋๋ค. ๊ฐ ํํฐ์ ์์ ๋ฐ Blob ํ๋ผ๋ฏธํฐ๋ ์๋ฌด ์๋ฏธ ์์ต๋๋ค.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Euresys.Open_eVision_2_11;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
EImageBW8 _image = new EImageBW8();
EImageBW8 _filter1 = new EImageBW8();
EImageBW8 _filter2 = new EImageBW8();
EImageBW8 _filter3 = new EImageBW8();
ECodedImage2 _codedImage = new ECodedImage2();
EImageEncoder _encoder = new EImageEncoder();
public Form1()
{
InitializeComponent();
}
private void buttonProcessing_Click(object sender, EventArgs e)
{
EasyImage.Equalize(_image, _filter1);
EasyImage.ConvolLowpass3(_filter1, _filter2);
EasyImage.OpenBox(_filter2, _filter3, 1);
_encoder.Encode(_filter3, _codedImage);
}
}
}
๋น๋ํ๊ณ dotPeek๋ฅผ ํตํด ์์ค ์ฝ๋๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
Visual Studio์์ ์ฝ๋๋ฅผ ์์ฑํ ๋ชจ์ต๊ณผ ์์ ํ ๋๊ฐ์ต๋๋ค. ์ ์กฐ์ฌ์์ ์ ๊ณตํ๋ .Net dll์ ์ฌ์ฉํด์ ์์ฑํ๋๋ฐ ๊ทธ๋๋ก ๋ ธ์ถ๋๋๊ตฐ์. ๋ฌผ๋ก ์ ์กฐ์ฌ์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ด ์๋๋ผ C#์ ์ฌ์ฉํ ๋ ์ด๋ ๊ฒ ์์ค ์ฝ๋๊ฐ ๋ ธ์ถ๋ ์ ์์ผ๋ ์ฃผ์ํ์๋ ๊ฒ์ ๊ฐ์กฐํ๋ ๊ฒ๋๋ค.
3'rd party library๋ก C++/CLI dll ์์ฑํ๋ ๋ฐฉ๋ฒ
C++ ์ฝ๋๋ก C++/CLI dll์ ์์ฑํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ.
1. ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก lib ํ์ผ ์์ฑ.
2. C++/CLI์์ lib๋ฅผ ์ฐธ์กฐํ์ฌ dll ์์ฑ.
3. ์์ฑ๋ dll์ C#์์ ์ฌ์ฉ.
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ.
1. C++/CLI์์ dll ์์ฑ.
2. ์์ฑ๋ dll์ C#์์ ์ฌ์ฉ.
๊ณผ์ ๋ง ๋ณด๋ฉด ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ด ๋ ๊ฐ๋จํฉ๋๋ค๋ง, ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๊ฒฝ์ฐ C++/CLI์์ ๋ชจ๋ Unmanaged code ๋ณ์๋ฅผ ํฌ์ธํฐ๋ก ์ ์ธํ์ฌ ์ฌ์ฉํด์ผ ํฉ๋๋ค. Unmanaged code์ธ C++์ Managed code์ธ C++/CLI์์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค ๋ณด๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ณธ๋ฌธ์์๋ ๋ ๋ฐฉ๋ฒ ๋ชจ๋ ์๊ฐํ๊ฒ ์ต๋๋ค.
์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
ํ๋์ ์๋ฃจ์ ์ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, C++/CLI, C# Windows Form ํ๋ก์ ํธ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๋จผ์ '์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ' ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
์ด ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ๋ก์ ํธ์ ํด๋์ค๋ฅผ ์ถ๊ฐํ๊ณ 3'rd party library๋ก ์ฝ๋๋ฅผ ๊ตฌํํฉ๋๋ค. ์๋๋ ํค๋ ํ์ผ์ ๋๋ค.
#pragma once
class CNative
{
public:
CNative();
~CNative();
private:
EImageBW8 m_image;
EImageBW8 m_filter1;
EImageBW8 m_filter2;
EImageBW8 m_filter3;
ECodedImage2 m_codedImage;
EImageEncoder m_encoder;
public:
bool Processing();
};
์๋๋ ์์ค ํ์ผ์ ๋๋ค.
#include "stdafx.h"
#include "CNative.h"
CNative::CNative()
{
}
CNative::~CNative()
{
}
bool CNative::Processing()
{
try
{
EasyImage::Equalize(&m_image, &m_filter1);
EasyImage::ConvolLowpass3(&m_filter1, &m_filter2);
EasyImage::OpenBox(&m_filter2, &m_filter3, 1);
m_encoder.Encode(m_filter3, m_codedImage);
return true;
}
catch (EException &exc)
{
return false;
}
}
๊ทธ๋ฆฌ๊ณ ๋น๋ํ๋ฉด ์๋์ ๊ฐ์ด ์ถ๋ ฅ ๊ฒฝ๋ก์ lib ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
๋ค์์ผ๋ก C++/CLI์์๋ ์์ฑ๋ lib ๋ฐ ํค๋ ํ์ผ์ ์ฐธ์กฐํ์ฌ Wrapping Class๋ฅผ ์์ฑํฉ๋๋ค. ์ฐ์ CLR ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
ํ๋ก์ ํธ๊ฐ ์์ฑ๋๋ฉด CNative.h ๊ฐ ์๋ include ๊ฒฝ๋ก๋ฅผ ์ค์ ํฉ๋๋ค.
lib์ ๊ฒฝ๋ก๋ ์ค์ ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก lib ํ์ผ๋ ์ ๋ ฅํฉ๋๋ค.
์ด๋ ๊ฒ ์ค์ ํ ํ ํค๋์๋ ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์ ์ํฉ๋๋ค.
#pragma once
#include "CNative.h"
using namespace System;
namespace Wrapper {
public ref class CWrapper
{
private:
CNative* m_pNative;
public:
CWrapper();
virtual ~CWrapper();
bool Processing();
};
}
์์ค์๋ ์๋์ ๊ฐ์ด ๊ตฌํํฉ๋๋ค. ๋จ์ํ ํธ์ถํ๋ ๊ฒ ๋ฐ์ ์์ต๋๋ค.
#include "stdafx.h"
#include "Wrapper.h"
namespace Wrapper
{
CWrapper::CWrapper() : m_pNative(new CNative)
{
}
CWrapper::~CWrapper()
{
delete m_pNative;
m_pNative = nullptr;
}
bool CWrapper::Processing()
{
return m_pNative->Processing();
}
}
๋น๋ํ๋ฉด ์๋์ ๊ฐ์ด ์ถ๋ ฅ ๊ฒฝ๋ก์ dll ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
์ด์ ๋ง์ง๋ง์ผ๋ก C# ํ๋ก์ ํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
C#์์ ์์ฑ๋ dll์ ์ฐธ์กฐ์ ์ถ๊ฐํ ํ ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ๊ตฌํํฉ๋๋ค. ๋ฌธ์ ์์ด ๋์ํฉ๋๋ค.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Wrapper;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
CWrapper _wrapper = new CWrapper();
public Form1()
{
InitializeComponent();
}
private void buttonProcessing_Click(object sender, EventArgs e)
{
_wrapper.Processing();
}
}
}
์์์ ๋ณด์ฌ๋๋ฆฐ ์์ ์ฝ๋๋ฅผ ์ฒจ๋ถํ์ต๋๋ค. SDK ์ค์น๋ ๋ผ์ด์ ์ค ์๊ด์์ด ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง๋ง ์ฐธ๊ณ ํ๋ฉด ๋ฉ๋๋ค.
C++/CLI์์ C# dll ๋ฐ๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ
์ด๋ฒ์๋ C++/CLI์์ 3'rd party library๋ก ์์ฑํ์ฌ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด C#์ฉ dll์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค. ์ด๋ฒ ๊ณผ์ ์ ์์์ ์๊ฐํ ๋ฐฉ๋ฒ๊ณผ ์ค๋ณต๋๋ ๋ถ๋ถ์ด ๋ง์, C++/CLI์์ ์ด๋ป๊ฒ ์์ฑ๋๋์ง๋ง ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
ํค๋ ๋ถ๋ถ์์ ์๋์ ๊ฐ์ด ์ ์ํฉ๋๋ค. C++๋ Unmanaged code์ด๊ธฐ ๋๋ฌธ์ ํฌ์ธํฐ ํ์์ผ๋ก ์ ์ํฉ๋๋ค.
#pragma once
using namespace System;
namespace Wrapper {
public ref class CWrapper
{
private:
EImageBW8 *_image;
EImageBW8 *_filter1;
EImageBW8 *_filter2;
EImageBW8 *_filter3;
ECodedImage2 *_codedImage;
EImageEncoder *_encoder;
public:
CWrapper();
virtual ~CWrapper();
bool Processing();
};
}
์์ค์๋ ์๋์ ๊ฐ์ด ๊ตฌํํฉ๋๋ค.
#include "stdafx.h"
#include "Wrapper.h"
namespace Wrapper
{
CWrapper::CWrapper()
{
_image = new EImageBW8();
_filter1 = new EImageBW8();
_filter2 = new EImageBW8();
_filter3 = new EImageBW8();
_codedImage = new ECodedImage2();
_encoder = new EImageEncoder();
}
CWrapper::~CWrapper()
{
delete _image;
_image = nullptr;
delete _filter1;
_filter1 = nullptr;
delete _filter2;
_filter2 = nullptr;
delete _filter3;
_filter3 = nullptr;
delete _codedImage;
_codedImage = nullptr;
delete _encoder;
_encoder = nullptr;
}
bool CWrapper::Processing()
{
try
{
EasyImage::Equalize(_image, _filter1);
EasyImage::ConvolLowpass3(_filter1, _filter2);
EasyImage::OpenBox(_filter2, _filter3, 1);
_encoder->Encode(*_filter3, *_codedImage);
return true;
}
catch (EException exc)
{
return false;
}
}
}
C# ํ๋ก์ ํธ์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ฑ๋ Wrapper dll์ ์ฐธ์กฐ๋ก ์ถ๊ฐํ๋ฉด ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ๊ณผ ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Wrapper;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
CWrapper _wrapper = new CWrapper();
public Form1()
{
InitializeComponent();
}
private void buttonProcessing_Click(object sender, EventArgs e)
{
_wrapper.Processing();
}
}
}
์ด๋์ ๋๊ฐ์ฃ ? ์ด๋ค ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ์๊ด์์ผ๋ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ด ์ ์ฐจ๊ฐ ์ค์ด๋๋ ๋ ์ฌ์ด ๊ฒ ๊ฐ์ต๋๋ค. ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์์ ์ฝ๋๋ ์ฒจ๋ถํ์ต๋๋ค.
'Programming > .Net' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[.Net] C#์์ Open API ๊ณ ์๋๋ก ๊ตํต๋ ์ ๋ณด ์ป๊ธฐ (์์ ํฌํจ)
[.Net] C#์์ Open API ๊ณ ์๋๋ก ๊ตํต๋ ์ ๋ณด ์ป๊ธฐ (์์ ํฌํจ)
2021.01.29 -
[.NET] google ๋ฐ Naver (SMTP) ๋ฉ์ผ ๋ณด๋ด๊ธฐ (์์ ํฌํจ)
[.NET] google ๋ฐ Naver (SMTP) ๋ฉ์ผ ๋ณด๋ด๊ธฐ (์์ ํฌํจ)
2021.01.14 -
[.Net] C++/CLI๋ก C#์์ ์ฌ์ฉํ๊ธฐ ์ํ dll ๋ง๋ค๊ธฐ (์์ ํฌํจ)
[.Net] C++/CLI๋ก C#์์ ์ฌ์ฉํ๊ธฐ ์ํ dll ๋ง๋ค๊ธฐ (์์ ํฌํจ)
2020.02.25 -
[.Net] C++/CLI ์ดํดํ๊ธฐ
[.Net] C++/CLI ์ดํดํ๊ธฐ
2020.02.22