Bug! Marshal.GetDelegateForFunctionPoiner returns wrong delegate
OS: Windows 10 x64, Ubuntu 16.04 x64
Framework: NetCoreApp 2.0, Net Framework 4.6
Given code:
using System; using System.Runtime.InteropServices; namespace MarshalDelegateError { public class Test1 { [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate IntPtr MyDelegateOne(IntPtr a, IntPtr b, IntPtr c); } public class Test2 { [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate IntPtr MyDelegateTwo(IntPtr a, IntPtr b, IntPtr c); } class Program { private static IntPtr MyTestFunc(IntPtr a, IntPtr b, IntPtr c) { return a; } static void Main(string[] args) { Console.WriteLine("Hello World!"); IntPtr ptr = Marshal.GetFunctionPointerForDelegate((Test1.MyDelegateOne)MyTestFunc); var d1 =(Test1.MyDelegateOne) Marshal.GetDelegateForFunctionPointer(ptr, typeof(Test1.MyDelegateOne)); var d2 = (Test2.MyDelegateTwo)Marshal.GetDelegateForFunctionPointer(ptr, typeof(Test2.MyDelegateTwo)); Console.WriteLine("Bug was not reproduced!"); } } }
But should works fine.
This problem forces developer to manually maintain strong one to one relationship between marshaling delegate name and marshaling delegate signature.
