備忘録

備忘録

C++(EXE)からC#(DLL)の関数を呼び出す方法(.NET 7 AOT利用)

Ⅰ. はじめに

タイトルの通り「C++(EXE)からC#(DLL)の関数を呼び出す方法(.NET 7 AOT利用)」です。

Ⅱ. 手順

1. C#(DLL)のサンプルプログラムを書く

Program.cs

using System.Runtime.InteropServices;

namespace MyDLL
{
  public class MyCalss
  {
    [UnmanagedCallersOnly(EntryPoint = "Sum")]
    public static int Sum(int a, int b)
    {
      return a + b;
    }
  }
}
2. C#(DLL)のプロジェクトファイルを編集する
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>

    <!-- OutputTypeにLibraryを指定する -->
    <OutputType>Library</OutputType>
    <!-- AOTコンパイラを利用する -->
    <PublishAot>true</PublishAot>
  </PropertyGroup>
</Project>
2. コンパイルする
dotnet publish /p:NativeLib=Shared -r win-x64 -c Release
3. C++(EXE)のサンプルプログラムを書く
#include <Windows.h>
#include <iostream>

typedef int (*Sum)(int a, int b);

int main()
{
  auto hModule = LoadLibrary(L"C:\\MyDLL.dll");
  auto sum = reinterpret_cast<Sum>(GetProcAddress(hModule, "Sum"));
  std::cout << sum(1, 2) << std::endl;

  return 0;
}

実行結果

3