DevSight

C#에서 C++, Rust, Zig 라이브러리 사용하기

이전 글 C# AOT 라이브러리 활용에서 C++ constexprzig 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}"  
)
Read More ···