- 
                Notifications
    
You must be signed in to change notification settings  - Fork 1
 
Open
Description
Processing dotnet/runtime#115746 (comment) command:
Command
-arm
using System;
using System.Runtime.InteropServices;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
namespace PInvokeBenchmark
{
    public class PInvokeBenchmarks
    {
        // Define a delegate type for our managed function
        private delegate int ManagedDelegate(bool value);
        
        // Define a matching function pointer type for unmanaged calls
        private unsafe delegate int UnmanagedDelegate(bool value);
        
        // The managed implementation
        private static int ManagedImplementation(bool value)
        {
            return value ? 42 : 0;
        }
        
        // Our instance of the delegate
        private readonly ManagedDelegate _managedDelegate;
        
        // Marshaled function pointer
        private readonly unsafe delegate* unmanaged<bool, int> _nativeFunctionPointer;
        
        // Delegate wrapping the marshaled function pointer
        private readonly unsafe delegate* unmanaged<bool, int> _unmanagedDelegate;
        // P/Invoke declaration for the native method
        [DllImport(@"C:\temp\pinvokeBench\NativeDll\NativeDll.dll", CallingConvention = CallingConvention.Cdecl)]
        private static extern int Method(bool value);
        public unsafe PInvokeBenchmarks()
        {
            // Create the managed delegate
            _managedDelegate = ManagedImplementation;
            // Marshal it to a native function pointer
            _nativeFunctionPointer = (delegate* unmanaged<bool, int>)Marshal.GetFunctionPointerForDelegate(_managedDelegate);
        }
        [Benchmark]
        public unsafe int MarshaledDelegateCall()
        {
            return _nativeFunctionPointer(true);
        }
    }
}(EgorBot will reply in this issue)
Metadata
Metadata
Assignees
Labels
No labels