User1454 Ответов: 2

Как загрузить собственную библиотеку DLL на основе платформы в .NET core


Всем привет,
У меня есть DLL-файл созданный в C++ код, который должен быть вызван .объем сердечника. И его вызывали успешно. Но теперь, основываясь на платформе, dll должна быть вызвана. Если это платформа "окна", он должен вызвать.DLL файла и если это 'линукс', он должен вызывать '.так файл'. Искал много решений, но не мог найти ни одного рабочего. Пожалуйста помочь.
Спасибо.

Что я уже пробовал:

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using System.Runtime;
using System.Reflection;

namespace NativeLibConsumeApp
{
    class Program
    {
        public delegate void CallBackDelegate(int a, int b);

        [DllImport("CallbackThreadSample.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void GetData();
        [DllImport("CallbackThreadSample.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void SetCallback(CallBackDelegate aCallback);
        static void Main(string[] args)
        {
            CallBackDelegate lTD = new CallBackDelegate(Program.Callback);
            SetCallback(lTD); //Sets up the callback
            int thread = Thread.CurrentThread.ManagedThreadId;
            GetData(); //This calls the callback in unmanaged code
           // while (true) ;
        }

        //Callback function which is called from the unmanaged code
        public static void Callback(int a, int b)
        {
            Console.WriteLine("A: {0} B: {1}", a, b);
            int thread = Thread.CurrentThread.ManagedThreadId;
        }
    }
}

2 Ответов

Рейтинг:
4

KarstenK

Используйте различные дочерние классы для каждой платформы и общий базовый класс или интерфейс.

Мета-код

PWorker worker = null;
if( IsWindow() {
 worker = new WindowWorker();
} else {
  worker = new LinuxWorker();
}
  work.DoMyWork();


Рейтинг:
19

Kornfeld Eliyahu Peter

У вас тут настоящая проблема...
Короче говоря, вам нужно скомпилировать два экземпляра вашего кода, один с помощью .dll-файл и один с файлом. so в нем...
Некоторые скажут, что вы можете написать гораздо более сложное решение, которое динамически загружает библиотеки/методы и выполняет их через Invoke, но для этого Вам также нужны некоторые собственные методы (LoadLibrary, GetProcAddress), так что вы попали в ловушку...