Я хочу вызвать файл С#.dll из кода ржавчиныC#

Место общения программистов C#
Anonymous
Я хочу вызвать файл С#.dll из кода ржавчины

Сообщение Anonymous »

Вызов .dll C# из Rust: проблема с вызовом функции
Проблема:
Я пытаюсь вызвать функции из .dll C# в Rust, используя контейнер загрузки библиотек . Хотя одна функция (my_name) работает правильно, другая функция (start_monitor) завершается сбоем из-за ошибки, связанной с отсутствием зависимости.
Код C# (MicMonitorDllNetFramework):

Код: Выделить всё

using NAudio.CoreAudioApi; using NAudio.CoreAudioApi.Interfaces; using RGiesecke.DllExport; using System; using System.Collections.Generic; using System.Diagnostics; using System.Runtime.InteropServices;

namespace MicMonitorDllNetFramework {
public class MicMonitor
{
[DllExport("start_monitor", CallingConvention = CallingConvention.Cdecl)]
public static void GetActiveApplications()
{
Console.WriteLine("Under the start monitor...");
var activeApps = new List();
using (var deviceEnumerator = new MMDeviceEnumerator())
{
var devices = deviceEnumerator.EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.Active);

foreach (var device in devices)
{
var sessionManager = device.AudioSessionManager;
var sessions = sessionManager.Sessions;
for (int i = 0; i < sessions.Count; i++)
{
var session = sessions[i];
string appName = "Unknown application";
try
{
if (session.State != AudioSessionState.AudioSessionStateInactive)
{
var processId = session.GetProcessID;
var process = Process.GetProcessById((int)processId);
appName = process.ProcessName;
activeApps.Add(appName);
}
}
catch (Exception ex)
{
// Log or handle the error if needed
}
}
}
}

foreach (var app in activeApps)
{
Console.WriteLine(app);
}
}

[DllExport("my_name", CallingConvention = CallingConvention.Cdecl)]
public static void MyName()
{
Console.WriteLine("Hello world!");
}
}}
Код Rust (main.rs):

Код: Выделить всё

extern crate libloading;

use libloading::{Library, Symbol};

type SayHelloFunc = unsafe extern "C" fn();

fn main() { let lib_path = "C:\path\to\MicMonitorDllNetFramework.dll"; let lib = unsafe { Library::new(lib_path).expect("Could not load the library") };
unsafe {
let myname: Symbol = lib.get(b"my_name\0").expect("Could not load the function good_morning");
let mics: Symbol = lib.get(b"start_monitor\0").expect("Could not load the function start_monitor");

myname();
mics(); // This call fails
}
Сообщение об ошибке:
Необработанное исключение: System.IO.FileNotFoundException: не удалось загрузить файл или сборку «NAudio.Wasapi, Версия = 2.2.1.0, Культура = нейтральная, PublicKeyToken = e279aa5131008a41' или одна из ее зависимостей. Система не может найти указанный файл.
в MicMonitorDllNetFramework.MicMonitor.GetActiveApplications()
ошибка: процесс не завершился успешно: target\debug\rust_mergedDll.exe (код выхода: 0xe0434352)
Дополнительные сведения:
Функция my_name успешно выводит «Hello world!».
Функция start_monitor завершается с ошибкой FileNotFoundException, особенно для NAudio.Wasapi.
>Я проверил, что на NAudio.Wasapi правильно ссылаются в проекте C# и он доступен в том же каталоге, что и DLL.
и когда я вызываю DLL (обе функции) из консольного приложения C#, это работает хорошо.
Что я пробовал:
Проверка зависимостей: я убедился, что NAudio.Wasapi правильно указан в проекте C# и присутствует в том же каталоге, что и MicMonitorDllNetFramework.dll.
Вызов функции: я успешно вызвал функцию my_name из Rust, используя контейнер загрузки библиотек.
Идентификация ошибок : При попытке вызвать функцию start_monitor из Rust я столкнулся с FileNotFoundException, связанным с NAudio.Wasapi.
Ожидание:
Я ожидал, что обе функции (my_name и start_monitor) будут вести себя хорошо аналогично, учитывая, что они экспортируются из одной и той же библиотеки C# (MicMonitorDllNetFramework.dll).
Предпринятые шаги:
Я загрузил библиотеку C# DLL (MicMonitorDllNetFramework .dll) с использованием контейнера загрузки библиотек в Rust.
Я успешно получил и вызвал функцию my_name из Rust, подтвердив, что вызов базовой функции работает.
Обнаружена проблема:
FileNotFoundException: функция start_monitor не выполняется и выдает исключение FileNotFoundException специально для NAudio.Wasapi.
Вопрос:
Как устранить исключение FileNotFoundException при вызове функция start_monitor из Rust? Несмотря на то, что NAudio.Wasapi находится в том же каталоге, что и MicMonitorDllNetFramework.dll, во время выполнения он отсутствует.
Дополнительные сведения:
Я в первую очередь разработчик C# и новичок в Rust, поэтому мы будем очень признательны за подробные объяснения или пошаговые решения.
Теги: [c#], [rust], [dll], [libloading], [naudio]Зависимости: libloading = "0.7"

Подробнее здесь: https://stackoverflow.com/questions/786 ... -rust-code

Вернуться в «C#»