C#에서 C++, Rust, Zig 라이브러리 사용하기
이전 글 C# AOT 라이브러리 활용에서 C++ constexpr, zig comptime, rust의 매크로 함수인 obfstr! 함수를 이용하여 컴파일 타임에 문자열을 난독화하는 예제를 소개했는데 이번 글에서 Native 컴파일 언어로 각각 구현하였다.
CppNative.dll , rust_native.dll , zig_native.dll (Zig는 0.16dev 버전)
graph LR
A["Native Library<br/>(Cpp, Rust, Zig)"]
-->B["Unmanaged C#(AOT)<br/>(ConsoleAppNative.dll)"]
B-->C["Manged C#<br/>(ConsoleApp.exe)"]
개발 환경
- Cpp : Clion + 툴체인(Visusql Studio 2022)
- Rust : RustRover + rust 1.94.1
- Zig : VSCode + zig 0.16.0-dev.3133+5ec8e45f3
- C# : Rider + .net 10
전체 예제는 Github에서 볼 수 있다.
CPP Example
1. Cpp : CMakeList.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cmake_minimum_required(VERSION 4.2)
project(CppNative)
set(CMAKE_CXX_STANDARD 20)
add_compile_options(/utf-8)
# 정적 컴파일
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
# 동적 컴파일 : dumpbin /dependents CppNative.dll 확인
# set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
add_library(CppNative SHARED
library.cpp
)
set_target_properties(CppNative PROPERTIES OUTPUT_NAME "CppNative" PREFIX "")
# 동적 컴파일 시 사용
#if (CMAKE_BUILD_TYPE STREQUAL "Debug")
# set(CMAKE_INSTALL_DEBUG_LIBRARIES ON)
#endif ()
#include(InstallRequiredSystemLibraries)
set(DEPLOY_DIR "${CMAKE_SOURCE_DIR}/deploy/$<CONFIG>")
add_custom_command(TARGET CppNative POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${DEPLOY_DIR}"
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:CppNative> "${DEPLOY_DIR}"
# 동적 컴파일 시 사용
#COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} "${DEPLOY_DIR}"
COMMENT "Deploying CppNative.dll and system dependencies to ${DEPLOY_DIR}"
)