@DailyDDose

Как на C# коздать Си-подобную DLL(которую можно динамически подгружать)?

К примеру на Си экспорт функций выглядит вот так:
extern "C" __declspec(dllexport) int Run() {
	return 488;
}


В основной программе я подгружаю нужные мне DLL и использую эскпортируемые ими функции вот так:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace wfa
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MyClass.LoadDll(@"D:\dev\csharp\test\Debug\cpx.dll");
            var result = MyClass.Run().ToString();
            MessageBox.Show(result, result);
        }
    }

    public class FunctionLoader
    {
        [DllImport("Kernel32.dll")]
        private static extern IntPtr LoadLibrary(string path);

        [DllImport("Kernel32.dll")]
        private static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

        public static Delegate LoadFunction<T>(string dllPath, string functionName)
        {
            var hModule = LoadLibrary(dllPath);
            var functionAddress = GetProcAddress(hModule, functionName);
            return Marshal.GetDelegateForFunctionPointer(functionAddress, typeof(T));
        }
    }

    public class MyClass
    {
        public delegate int FnDelegate();
        public static FnDelegate Run;

        public static void LoadDll(string path)
        {
            Run = (FnDelegate)FunctionLoader.LoadFunction<FnDelegate>(path, "Run");
        }
    }
}

Bwl1EUeO-mU.jpg
полный исходный код: https://github.com/DailyDDose/DllTesting
  • Вопрос задан
  • 2813 просмотров
Пригласить эксперта
Ответы на вопрос 3
Это развитие того, что вы пробовали.
Есть Nuget пакет.
Ответ написан
@John_Nash
coder
C# не предназначен для таких задач

Если нужно делать вызовы из неуправляемого кода к NET сборкам, используйте COM или обертки на C++ CLI
Ответ написан
@DailyDDose Автор вопроса
решение Unmanaged Exports от Robert Giesecke не собирается, возникают ошибки на этапе компиляции
Error The command "NSBin.bat "D:\dev\csharp\test\packages\DllExport.1.5.2\tools\..\lib\net20\DllExport.dll" "System.Runtime.InteropServices" "true"" exited with code 1.

class Test
{
    [DllExport("add", CallingConvention = CallingConvention.Cdecl)]
    public static int Run()
    {
        return 1082;
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы