๋ฐ˜์‘ํ˜•

์†Œ๊ฐœ

๋ณธ๋ฌธ์„ ์ฝ๊ธฐ ์ „์— C++/CLI๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜๋ฉด ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ผ ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

[.Net] C++/CLI ์ดํ•ดํ•˜๊ธฐ

 

[.Net] C++/CLI ์ดํ•ดํ•˜๊ธฐ

์†Œ๊ฐœ ์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ C# ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ ์‹œ .Net Decompiler์— ์˜ํ•ด ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์„ฑ์„ ์†Œ๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. [.Net] .Net Framework์™€ ๋””์ปดํŒŒ์ผ๋Ÿฌ(Decompiler) ILSpy ๋ฐ dotPeek ์˜ˆ์ œ [.Net] .Net Fram..

luckygg.tistory.com

๋”๋ถˆ์–ด ๊ธฐ์ดˆ ์˜ˆ์ œ๋ฅผ ๋”ฐ๋ผ ํ•ด ๋ณด๋ฉด ๋ณธ๋ฌธ์„ ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

[.Net] C++/CLI๋กœ C#์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ dll ๋งŒ๋“ค๊ธฐ (์˜ˆ์ œ ํฌํ•จ)

 

[.Net] C++/CLI๋กœ C#์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ dll ๋งŒ๋“ค๊ธฐ (์˜ˆ์ œ ํฌํ•จ)

์†Œ๊ฐœ ๋ณธ๋ฌธ์„ ์ฝ๊ธฐ ์ „์— C++/CLI๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜๋ฉด ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ผ ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. [.Net] C++/CLI ์ดํ•ดํ•˜๊ธฐ [.Net] C++/CLI ์ดํ•ดํ•˜๊ธฐ ์†Œ๊ฐœ ์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ C# ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ ์‹œ .Net Decompiler์— ์˜..

luckygg.tistory.com

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)์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ์ ๋งŒ ๋ณด์—ฌ๋“œ๋ฆฌ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋”ฐ๋กœ ์˜ˆ์ œ ํŒŒ์ผ์€ ๋งŒ๋“ค์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์— .Net์šฉ dll์„ ์ถ”๊ฐ€ํ•œ ๋ชจ์Šต

์†Œ์Šค ์ฝ”๋“œ๋Š” ๋Œ€์ถฉ ํ•„ํ„ฐ ๋ช‡ ๊ฐœ๋ฅผ ์—ฐ๋‹ฌ์•„ ์ˆ˜ํ–‰ํ•˜๊ณ  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๋ฅผ ํ†ตํ•ด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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 ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ๋œ lib ํŒŒ์ผ

๋‹ค์Œ์œผ๋กœ C++/CLI์—์„œ๋Š” ์ƒ์„ฑ๋œ lib ๋ฐ ํ—ค๋” ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์—ฌ Wrapping Class๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„  CLR ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

CLR ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ

ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด CNative.h ๊ฐ€ ์žˆ๋Š” include ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

include ๊ฒฝ๋กœ ์„ค์ •

lib์˜ ๊ฒฝ๋กœ๋„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

lib ๊ฒฝ๋กœ ์„ค์ •

๋งˆ์ง€๋ง‰์œผ๋กœ 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 ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ƒ์„ฑ๋œ dll ํŒŒ์ผ

์ด์ œ ๋งˆ์ง€๋ง‰์œผ๋กœ C# ํ”„๋กœ์ ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

C# Windows Forms ์•ฑ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ

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 ์„ค์น˜๋‚˜ ๋ผ์ด์„ ์Šค ์ƒ๊ด€์—†์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€๋งŒ ์ฐธ๊ณ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

method1.zip
0.03MB

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();
        }
    }
}

์–ด๋•Œ์š” ๋˜‘๊ฐ™์ฃ ? ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋“  ์ƒ๊ด€์—†์œผ๋‚˜ ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด ์ ˆ์ฐจ๊ฐ€ ์ค„์–ด๋“œ๋‹ˆ ๋” ์‰ฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋„ ์ฒจ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

method2.zip
0.03MB

๋ฐ˜์‘ํ˜•