Как через GetProcAddress вызвать функцию из dll

проблема в том что возникает ошибка при вызове функции Main введите сюда описание изображения введите сюда описание изображения

Startup.cs или по другому файл в котором я создаю фоновый процесс

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddHostedService<Service>();
        }

Service.cs, в нем собственно вся логика

using Microsoft.Extensions.Hosting;
using System;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;

namespace TestDll
{
    public static class NativeMethods
    {
        [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        [ResourceExposure(ResourceScope.Process)]
        public static extern IntPtr LoadLibrary(string libFilename);

        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)]
        static internal extern IntPtr GetProcAddress(IntPtr HModule, [MarshalAs(UnmanagedType.LPStr), In] string funcName/*lpcstr*/);

        [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        [ResourceExposure(ResourceScope.Process)]
        public static extern bool FreeLibrary(IntPtr hModule);
    }

    public class Service : IHostedService
    {
        private Task task { get; set; }

        public Task StartAsync(CancellationToken cancellationToken)
        {
            Console.WriteLine("start: StartAsync");
            task = Task.Run(() => Worker());
            return Task.CompletedTask;
        }

        private void Worker()
        {
            while (true)
            {
                var dll  = NativeMethods.LoadLibrary("D:\\source\\repos\\CreateDll\\bin\\Debug\\CreateDll.dll");
                if (dll == IntPtr.Zero)
                {
                    throw new Exception($"Could not load library: {Marshal.GetLastWin32Error()}");
                }

                var functionDll = NativeMethods.GetProcAddress(dll, "CreateDll.Program.Main");
                if (functionDll == IntPtr.Zero)
                {
                    //NativeMethods.FreeLibrary(dll);
                    throw new Exception($"Could not load method: {Marshal.GetLastWin32Error()}"); // Could not load method: 127
                }
                
                NativeMethods.FreeLibrary(dll);
            }
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            Console.WriteLine("start: StopAsync");
            task.Dispose();
            return Task.CompletedTask;
        }
    }
}

код dll

using System;

namespace CreateDll
{
    public class Program
    {
        public static void Main()
        {
            Console.WriteLine(@"hello world");

            // должен блокировать бесконечный процесс
            // через 5 секунд, может меньше
            while (true)
            {
                Console.WriteLine("process");
            }
        }
    }
}

если вывести ответ из LoadLibrary, то получаю: 0x00000257d0010000


Ответы (0 шт):