πŸ–₯️ Coding/C#

C# μ—μ„œ C++ ν•¨μˆ˜ 호좜

SpaceJ 2021. 7. 26. 16:41
λ°˜μ‘ν˜•

C#μ—μ„œ C++ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 μžˆλ„λ‘ ν•˜λ €λ©΄, __declspec(dllexport) ν‚€μ›Œλ“œλ₯Ό λ°˜ν™˜ν˜• μ•žμ— μΆ”κ°€ν•΄μ•Ό ν•œλ‹€. μ‚¬μš©ν•  수 μžˆλ„λ‘ λ³„λ„μ˜ 선언이 μΆ”κ°€λ˜μ–΄μ•Ό ν•œλ‹€.

// Test.dll - Test.cpp

#define DllExport   __declspec( dllexport )

DllExport int __stdcall Test(int i)
{
	return i + 10;
}

C# μ—μ„œλ„ C++ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ €λ©΄ DllImportAttribute 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬μ•Ό ν•œλ‹€. 이 λ•Œ, C#κ³Ό C++μ—μ„œ 데이터 ν‘œν˜„λ°©λ²•μ΄ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 적절히 λ§ˆμƒ¬λ§ν•΄μ£Όμ–΄μ•Ό ν•˜λŠ”λ°, 이λ₯Ό μœ„ν•œ 약속을 Calling Convention (호좜 κ·œμ•½) 이라고 ν•œλ‹€. λ§ˆμƒ¬λ§μ΄λž€, ν•œ 객체의 λ©”λͺ¨λ¦¬λ₯Ό μ €μž₯ λ˜λŠ” 전솑에 μ ν•©ν•œ ν˜•νƒœλ‘œ λ³€ν™˜ν•˜λŠ” 과정을 μ˜λ―Έν•œλ‹€.

using System;
using System.Runtime.InteropServices;

class Example
{
    // Use DllImport to import the Win32 MessageBox function.
    [DllImport("user32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
    public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
    
    static void Main()
    {
        // Call the MessageBox function using platform invoke.
        MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
    }
}
λ°˜μ‘ν˜•