프로그래밍과 잡담

Rust 구조체를 C#에서 사용하기 본문

프로그래밍/Rust

Rust 구조체를 C#에서 사용하기

크레온 2020. 7. 23. 11:16

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);

 

 

 

반응형
Comments