Подключение rust к DAR

Пример подключения dll сгенерированной на rust к DAR

rust

Описание

DAR позволяет запускать dll, которые сгенерированы на rust

Код библиотеки на Rust

use std::{ffi::c_char, slice};
#[unsafe(no_mangle)]
pub extern "C" fn dar_print(ptr: *const c_char, len: usize,) {
    if ptr.is_null() {
        println!("empty");
        return;
    }
    let bytes = unsafe { slice::from_raw_parts(ptr as *const u8, len,) };
    match std::str::from_utf8(bytes,) {
        Ok(s,) => println!("{}", s),
        Err(_,) => eprintln!("[print-stub] invalid UTF-8"),
    }
}
#[unsafe(no_mangle)]
pub extern "C" fn send_to_server(ptr: *const c_char, len: usize,) {
    if ptr.is_null() {
        eprintln!("[send_to_server] received empty");
        return;
    }
    let bytes = unsafe { slice::from_raw_parts(ptr as *const u8, len,) };
    match std::str::from_utf8(bytes,) {
        Ok(s,) => println!("[send_to_server] data: {}", s),
        Err(_,) => eprintln!("[send_to_server] invalid UTF-8"),
    }
}
#[unsafe(no_mangle)]
pub extern "C" fn log_error(ptr: *const c_char, len: usize,) {
    if ptr.is_null() {
        eprintln!("[log_error] empty message");
        return;
    }
    let bytes = unsafe { slice::from_raw_parts(ptr as *const u8, len,) };
    match std::str::from_utf8(bytes,) {
        Ok(s,) => eprintln!("ERROR: {}", s),
        Err(_,) => eprintln!("[log_error] invalid UTF-8"),
    }
}
#[unsafe(no_mangle)]
pub extern "C" fn get_hostname(ptr: *const c_char, len: usize,) {
    if ptr.is_null() {
        println!("[get_hostname] called with empty");
    } else {
        let bytes = unsafe { slice::from_raw_parts(ptr as *const u8, len,) };
        if let Ok(s,) = std::str::from_utf8(bytes,) {
            println!("[get_hostname] called with argument: {}", s);
        }
    }
}

Скрипт на dar

external "print.dll" {
    dar_print : print,
    send_to_server,
    log_error : log,
    get_hostname
}

print("Hello, world!")
send_to_server("client data")
log("something went wrong")
get_hostname("test")