반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 28 |
29 | 30 | 31 |
Tags
- 양평역
- FFI
- c언어
- Qt 소켓프로그래밍
- android SAF
- 바이크
- 알람프로그램
- QT
- 안드로이드
- QTcpServer
- 스타크래프트2
- 스타2
- 고속도로
- 잡담
- vuejs
- Qt4
- Java
- qt 설치
- 엑티브엑스
- 이륜차
- 정성하
- 자바
- 윈도우7
- Qt OpenGL
- HTML
- 마영전
- 디자이어HD
- 재귀함수
- 오토바이
- 자료구조
Archives
- Today
- Total
프로그래밍과 잡담
Rust 구조체를 C#에서 사용하기 본문
ust는 다른 언어를 위한 인터페이스가 존재한다. 구조는 C 인터페이스를 사용한다.
그에 대한 사용법은 아래와 같다.
Rust에서 선언 이렇게 하면 되고
// Rust에서 다른 언어로 넘길 때 사용하는 구조체 아래의 어노테이션을 써야한다.
#[repr(C)]
pub struct Data{
pub int_val : i32,
pub double_val: f64,
// 문자열 쓸려면 이렇게 해야함.
pub str_val: *const c_char
}
// 이건 뭐 해도 되고 안해도 됨
impl Clone for Data{
fn clone(&self) -> Data {
Data {
int_val: self.int_val,
double_val: self.double_val,
str_val: self.str_val.clone()
}
}
}
C#에서의 구조체 선언 Rust에서 선언한거하고 거의 비슷하다. stirng 쪽만 빼면..
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct Data
{
public int int_val;
public double double_val;
// 이 부분은 string 이다.
public IntPtr str_val;
}
테스트로 사용할 Rust 함수들
// 전역변수
static mut GLOBAL_DATAS: Vec<Data> = vec!();
// 그냥 값 Data 구조체 받아서 위 전역변수에 넣는거
#[no_mangle]
pub extern fn add_data(item: *mut Data){
unsafe{
let tmp = &(*item);
let data = tmp.clone();
// 위의 클론을 써도 되고 아니면 아래처럼 만들어도 된다.
// let data = Data {
// int_val: tmpr( data.str_val);
// println!("input data [ int: {}, double: {}, str : {} ]", data.int_val, data.double_val, data.str_val);
println!("input data [ int: {}, double: {} str : {} ]", data.int_val, data.double_val, cstr.to_str().unwrap());
GLOBAL_DATAS.push(data);
}
}
// 넣은거 최근거 가져오는 부분
#[no_mangle]
pub extern fn get_data() -> Data {
unsafe {
let r: Option<Data> = GLOBAL_DATAS.pop();
let value = r.unwrap();
println!("rust out : int {}, double {}", value.int_val, value.double_val);
return value;
}
}
C#에서 호출 부분..
var data = new Data()
{
int_val = 10,
double_val = 10.5,
// 아래의 부분은 string을 intptr로 변환하는 작업
str_val = Marshal.StringToCoTaskMemUTF8("Hello Rust World~!!")
};
AddData(data);
var tmp = GetData();
// 가져온 문자열을 다시 C# string으로 변환
var str = Marshal.PtrToStringUTF8(tmp.str_val);
반응형
'프로그래밍 > Rust' 카테고리의 다른 글
[Rust] Rust로 라즈베리파이 GPIO 포트 제어하기 (0) | 2022.04.07 |
---|---|
[Rust] 안드로이드용 Rust 라이브러리 빌드를 위한 셋팅 (0) | 2020.07.05 |
Rust dll을 다른 언어에서 사용하기 (FFI) (0) | 2019.10.24 |
Comments