C++/C++ DLL

C++ DLL 을 C# 에서 사용하기

doublerabbits 2022. 8. 29. 21:04

1. Visual Studio 에서 솔루션 구성을 위한 빈 솔루션 생성

  • 기타 프로젝트 형식 - Visual Studio 솔루션 - 빈 솔루션

 

 

 

2. C++ DLL 프로젝트 생성

  • 추가 - 새 프로젝트
  • Visual C++ - Windows 데스크톱 - DLL(동적 연결 라이브러리)

 

3. CppLib 프로젝트 속성 변경

  • 출력 디렉토리 변경

기존 : $(SolutionDir)$(Configuration)\

변경 : $(SolutionDir)CSApp\bin\$(Configuration)

 

4. C# App 프로젝트 생성

  • 추가 - 새 프로젝트
  • 다른 언어 - Visual C# - Windows Desktop - 콘솔 앱(.NET Framework)

 

 

5. 프로젝트 구성 완료

 

 

6. CSApp 시작 프로젝트로 설정

 

 

 

7. CSApp 참조 추가

  • 참조 관리자 - 찾아보기 - CppLib.dll

 

 

8. CppLib - dllmain.cpp

// dllmain.cpp : DLL 애플리케이션의 진입점을 정의합니다.
#include "pch.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

extern "C" __declspec(dllexport) double Add(double a, double b)
{
	return (a + b);
}

extern "C" __declspec(dllexport) double Sub(double a, double b)
{
	return (a - b);
}

extern "C" __declspec(dllexport) double Mul(double a, double b)
{
	return (a * b);
}

extern "C" __declspec(dllexport) double Div(double a, double b)
{
	return (a / b);
}

 

 

 

9. CSApp - Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace CSApp
{
    class Program
    {
        [DllImport("CppLib.dll", CallingConvention =CallingConvention.Cdecl)]
        public static extern double Add(double a, double b);
        [DllImport("CppLib.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern double Sub(double a, double b);
        [DllImport("CppLib.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern double Mul(double a, double b);
        [DllImport("CppLib.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern double Div(double a, double b);

        static void Main(string[] args)
        {
            Console.WriteLine($"CppLib CSApp : call function");
            Console.WriteLine($"Add : {Add(1, 2)}");
            Console.WriteLine($"Sub : {Sub(1, 2)}");
            Console.WriteLine($"Mul : {Mul(1, 2)}");
            Console.WriteLine($"Div : {Div(1, 2)}");
            Console.ReadKey();
        }
    }
}

 

 

 

C++ DLL 을 C# 에서 사용하기 (구조체)

 

C++ DLL 을 C# 에서 사용하기 (구조체)

1. 프로젝트 만들기 및 속성은 이전 글 확인 C++ DLL 을 C# 에서 사용하기 C++ DLL 을 C# 에서 사용하기 1. Visual Studio 에서 솔루션 구성을 위한 빈 솔루션 생성 기타 프로젝트 형식 - Visual Studio 솔루션 -..

doublerabbits.tistory.com

 

 

 

PInvokeStackImbalance

 

PInvokeStackImbalance

기존 아래와 같이 사용하던 코드에서 에러가 발생 [DllImport("CppLib.dll")] CallingConvention 추가 [DllImport("CppLib.dll", CallingConvention = CallingConvention.Cdecl)] C++ : Cdecl Delphi : StdCall

doublerabbits.tistory.com