🙌

C#からMacのネイティブAPIを呼び出す

2024/01/27に公開

Xamarin.MacがサポートしていないMacのネイティブAPIがあるので、それをObjectiveC経由で呼び出す。
実装:https://github.com/Atsushi570/dotnet8-macos-playground

呼び出されるObjectiveC側

Vision APIを使ってAPIを行う。
実装の詳細はリポジトリ参照。

#include <CoreGraphics/CoreGraphics.h>

#ifdef __cplusplus
extern "C" {
#endif

// C言語スタイルの関数宣言
const char* performOCROnImage(CGImageRef imageRef);

#ifdef __cplusplus
}
#endif

呼び出すC#側

DLLImportで関数宣言する。

public class ScreenshotOCRProcessor
{
    public void PerformOCRFromScreenshot()
    {
        // スクリーンショットを取得
        var screenshot = GetScreenCGImage();

        IntPtr resultPtr = PerformOCRWithCGImage(screenshot.Handle);
        string ocrResult = Marshal.PtrToStringAuto(resultPtr);

        // タイムスタンプを生成
        string timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");

        File.WriteAllText($"OCRResult_{timestamp}.txt", ocrResult);

    }

    [DllImport("libOCRProcessor", EntryPoint = "performOCROnImage")]
    private static extern IntPtr PerformOCRWithCGImage(IntPtr imageRef);

    private CGImage? GetScreenCGImage()
    {
        return CGImage.ScreenImage(0, CGRect.Infinite, CGWindowListOption.OnScreenOnly, CGWindowImageOption.BestResolution);
    }

}

Discussion