К примеру на Си экспорт функций выглядит вот так:
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");
}
}
}
полный исходный код:
https://github.com/DailyDDose/DllTesting