using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace DllExportLibrary
{
public static class Export
{
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr AllocConsole();
public unsafe struct MyFunctionParams
{
public byte* Param;
public int Number;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class CalculationResult
{
public int Addition;
[MarshalAs(UnmanagedType.I4)]
public int Subtraction;
[MarshalAs(UnmanagedType.I4)]
public int Multiply;
[MarshalAs(UnmanagedType.I4)]
public int Divide;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class AddParams
{
[MarshalAs(UnmanagedType.I4)]
public int First;
[MarshalAs(UnmanagedType.I4)]
public int Second;
}
[DllExport]
public static void MyFunction(IntPtr pars)
{
Console.WriteLine("Hello from injected dll Export::MyFunction!");
unsafe
{
byte[] bytes = new byte[64];
int i = 0;
MyFunctionParams* myParams = (MyFunctionParams*) pars;
byte* param = myParams->Param - 1;
while (*(++param) != 0)
{
bytes[i++] = *param;
}
string ascii = Encoding.ASCII.GetString(bytes);
Console.WriteLine($"The passed param is: {ascii}");
Console.WriteLine($"Random number passed: {myParams->Number}");
}
}
[DllExport]
public static int Main()
{
AllocConsole();
Console.WriteLine("Hello from injected dll Export::Main!");
return 1;
}
[DllExport]
public static CalculationResult Calc(AddParams pars)
{
return new CalculationResult
{
Addition = pars.First + pars.Second,
Divide = pars.First / pars.Second,
Multiply = pars.First * pars.Second,
Subtraction = pars.First - pars.Second,
};
}
[DllExport]
public static int Add(AddParams pars)
{
Console.WriteLine($"Performing addition of numbers {pars.First} and {pars.Second}");
return pars.First + pars.Second;
}
}
}