Информация об изменениях

Сообщение Re[12]: C#,Java, go - дико дорого от 06.06.2022 16:28

Изменено 06.06.2022 20:01 Serginio1

Re[12]: C#,Java, go - дико дорого
Здравствуйте, vaa, Вы писали:



S>> Ты пробовал?

vaa>Так точно!
Ну вот редиска ты!


Генерится нативная Microsoft.Interop.Tests.NativeExportsNE.dll библиотека размером 945 кб. Там еще 2 дополнительные Microsoft.Interop.Tests.NativeExports.dll и Microsoft.Interop.Ancillary.dll по 20 и 12 кб

Вызов из .Net такой

namespace Demo
{
    internal static partial class NativeExportsNE
    {
        public const string NativeExportsNE_Binary = "Microsoft.Interop.Tests." + nameof(NativeExportsNE);

        [LibraryImport(NativeExportsNE_Binary, EntryPoint = "sumi")]
        public static partial int Sum(int a, int b);

        [LibraryImport(NativeExportsNE_Binary, EntryPoint = "sumouti")]
        public static partial void Sum(int a, int b, out int c);

        [LibraryImport(NativeExportsNE_Binary, EntryPoint = "sumrefi")]
        public static partial void Sum(int a, ref int b);
    }

    internal static class Program
    {
        public static void Main(string[] args)
        {
            int a = 12;
            int b = 13;
            int c = NativeExportsNE.Sum(a, b);
            Console.WriteLine($"{a} + {b} = {c}");

            c = 0;
            NativeExportsNE.Sum(a, b, out c);
            Console.WriteLine($"{a} + {b} = {c}");

            c = b;
            NativeExportsNE.Sum(a, ref c);
            Console.WriteLine($"{a} + {b} = {c}");
        }
    }
}


Там далеко не ПриветМир.
namespace NativeExports
{
    public static unsafe class Demo
    {
        [UnmanagedCallersOnly(EntryPoint = "sumi")]
        public static int Sum(int a, int b)
        {
            return a + b;
        }

        [UnmanagedCallersOnly(EntryPoint = "sumouti")]
        public static void SumOut(int a, int b, int* c)
        {
            *c = a + b;
        }

        [UnmanagedCallersOnly(EntryPoint = "sumrefi")]
        public static void SumRef(int a, int* b)
        {
            *b += a;
        }
    }
}

И еще куча классов для тестов.

Я так понимаю, что за компиляцию в Native отвечает DNNE
https://github.com/AaronRobinsonMSFT/DNNE
https://github.com/AaronRobinsonMSFT/DNNE/blob/master/src/msbuild/DNNE.props

Вот и верь тебе после этого!
Re[12]: C#,Java, go - дико дорого
Здравствуйте, vaa, Вы писали:



S>> Ты пробовал?

vaa>Так точно!
Ну вот редиска ты!


Генерится нативная Microsoft.Interop.Tests.NativeExportsNE.dll библиотека размером 945 кб. Там еще 2 дополнительные Microsoft.Interop.Tests.NativeExports.dll и Microsoft.Interop.Ancillary.dll по 20 и 12 кб

Вызов из .Net такой

namespace Demo
{
    internal static partial class NativeExportsNE
    {
        public const string NativeExportsNE_Binary = "Microsoft.Interop.Tests." + nameof(NativeExportsNE);

        [LibraryImport(NativeExportsNE_Binary, EntryPoint = "sumi")]
        public static partial int Sum(int a, int b);

        [LibraryImport(NativeExportsNE_Binary, EntryPoint = "sumouti")]
        public static partial void Sum(int a, int b, out int c);

        [LibraryImport(NativeExportsNE_Binary, EntryPoint = "sumrefi")]
        public static partial void Sum(int a, ref int b);
    }

    internal static class Program
    {
        public static void Main(string[] args)
        {
            int a = 12;
            int b = 13;
            int c = NativeExportsNE.Sum(a, b);
            Console.WriteLine($"{a} + {b} = {c}");

            c = 0;
            NativeExportsNE.Sum(a, b, out c);
            Console.WriteLine($"{a} + {b} = {c}");

            c = b;
            NativeExportsNE.Sum(a, ref c);
            Console.WriteLine($"{a} + {b} = {c}");
        }
    }
}


Там далеко не ПриветМир.
namespace NativeExports
{
    public static unsafe class Demo
    {
        [UnmanagedCallersOnly(EntryPoint = "sumi")]
        public static int Sum(int a, int b)
        {
            return a + b;
        }

        [UnmanagedCallersOnly(EntryPoint = "sumouti")]
        public static void SumOut(int a, int b, int* c)
        {
            *c = a + b;
        }

        [UnmanagedCallersOnly(EntryPoint = "sumrefi")]
        public static void SumRef(int a, int* b)
        {
            *b += a;
        }
    }
}

И еще куча классов для тестов.
например
public static unsafe class DelegatesAndFunctionPointers
    {
        [UnmanagedCallersOnly(EntryPoint = "invoke_callback_after_gc")]
        public static void InvokeCallbackAfterGCCollect(delegate* unmanaged<void> fptr)
        {
            // We are at the mercy of the GC to verify our delegate has been retain
            // across the native function call. This is a best effort validation.
            for (int i = 0; i < 5; ++i)
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }

            // If the corresponding Delegate was collected, the runtime will rudely abort.
            fptr();
        }

        [UnmanagedCallersOnly(EntryPoint = "invoke_managed_callback_after_gc")]
        public static void InvokeManagedCallbackAfterGCCollect(void* fptr)
        {
            // We are at the mercy of the GC to verify our delegate has been retain
            // across the native function call. This is a best effort validation.
            for (int i = 0; i < 5; ++i)
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }

            // If the corresponding Delegate was collected, the runtime will rudely abort.
            ((delegate*<void>)fptr)();
        }

        [UnmanagedCallersOnly(EntryPoint = "invoke_callback_blittable_args")]
        public static int InvokeCallbackWithBlittableArgument(delegate* unmanaged<int, int, int> fptr, int a, int b)
        {
            return fptr(a, b);
        }

        [UnmanagedCallersOnly(EntryPoint = "invoke_managed_callback_blittable_args")]
        public static int InvokeManagedCallbackWithBlittableArgument(void* fptr, int a, int b)
        {
            return ((delegate*<int, int, int>)fptr)(a, b);
        }
    }


Я так понимаю, что за компиляцию в Native отвечает DNNE
https://github.com/AaronRobinsonMSFT/DNNE
https://github.com/AaronRobinsonMSFT/DNNE/blob/master/src/msbuild/DNNE.props

Вот и верь тебе после этого!