diff options
Diffstat (limited to 'tests/src/Interop')
5 files changed, 56 insertions, 24 deletions
diff --git a/tests/src/Interop/CMakeLists.txt b/tests/src/Interop/CMakeLists.txt index f3478fd56f..c1c37d598b 100644 --- a/tests/src/Interop/CMakeLists.txt +++ b/tests/src/Interop/CMakeLists.txt @@ -1,5 +1,6 @@ include_directories(common) +add_subdirectory(NativeCallable) add_subdirectory(PrimitiveMarshalling/Bool) add_subdirectory(PrimitiveMarshalling/UIntPtr) add_subdirectory(ArrayMarshalling/BoolArray) @@ -10,4 +11,4 @@ add_subdirectory(RefCharArray) add_subdirectory(StringMarshalling/LPSTR) add_subdirectory(StringMarshalling/LPTSTR) add_subdirectory(MarshalAPI/FunctionPointer) -add_subdirectory(MarshalAPI/IUnknown)
\ No newline at end of file +add_subdirectory(MarshalAPI/IUnknown) diff --git a/tests/src/Interop/NativeCallable/CMakeLists.txt b/tests/src/Interop/NativeCallable/CMakeLists.txt new file mode 100644 index 0000000000..5236b3c873 --- /dev/null +++ b/tests/src/Interop/NativeCallable/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required (VERSION 2.6) +project (NativeCallableDll) +set(SOURCES NativeCallableDll.cpp ) + +# add the executable +add_library (NativeCallableDll SHARED ${SOURCES}) + +# add the install targets +install (TARGETS NativeCallableDll DESTINATION bin) diff --git a/tests/src/Interop/NativeCallable/NativeCallableDll.cpp b/tests/src/Interop/NativeCallable/NativeCallableDll.cpp new file mode 100644 index 0000000000..6ba63ff875 --- /dev/null +++ b/tests/src/Interop/NativeCallable/NativeCallableDll.cpp @@ -0,0 +1,12 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#include <xplatform.h> + +typedef int (*CALLBACKADDPROC)(int n); + +extern "C" DLL_EXPORT int WINAPI CallManagedAdd(CALLBACKADDPROC pCallbackAddProc, int n) +{ + return pCallbackAddProc(n); +} diff --git a/tests/src/Interop/NativeCallable/NativeCallableTest.cs b/tests/src/Interop/NativeCallable/NativeCallableTest.cs index 4fd390226d..0dcc184b4a 100644 --- a/tests/src/Interop/NativeCallable/NativeCallableTest.cs +++ b/tests/src/Interop/NativeCallable/NativeCallableTest.cs @@ -14,53 +14,60 @@ public class Program { public static class NativeMethods { - [DllImport("user32.dll")] - public static extern int EnumWindows(IntPtr enumProc, IntPtr lParam); + [DllImport("NativeCallableDll")] + public static extern int CallManagedAdd(IntPtr callbackProc, int n); } + private delegate int IntNativeMethodInvoker(); private delegate void NativeMethodInvoker(); - static EventWaitHandle waitHandle = new AutoResetEvent(false); public static int Main() { + int ret; //NegativeTest_NonBlittable(); - TestNativeCallableValid(); + ret = TestNativeCallableValid(); + if (ret != 100) + return ret; //NegativeTest_ViaDelegate(); //NegativeTest_ViaLdftn(); return 100; } - public static void TestNativeCallableValid() + public static int TestNativeCallableValid() { /* void TestNativeCallable() { .locals init ([0] native int ptr) IL_0000: nop - IL_0002: ldftn int32 CallbackMethod(native int,native int) + IL_0002: ldftn int32 CallbackMethod(int32) IL_0012: stloc.0 IL_0013: ldloc.0 - IL_0014: ldsfld native int [mscorlib]System.IntPtr::Zero - IL_0019: call bool NativeMethods::EnumWindows(native int, - native int) + IL_0014: ldc.i4 100 + IL_0019: call bool NativeMethods::CallNativeAdd(native int, int) IL_001e: pop IL_001f: ret } */ - DynamicMethod testNativeCallable = new DynamicMethod("TestNativeCallable", null, null, typeof(Program).Module); + DynamicMethod testNativeCallable = new DynamicMethod("TestNativeCallable", typeof(int), null, typeof(Program).Module); ILGenerator il = testNativeCallable.GetILGenerator(); il.DeclareLocal(typeof(IntPtr)); il.Emit(OpCodes.Nop); - il.Emit(OpCodes.Ldftn, typeof(Program).GetMethod("CallbackMethod")); + + // Get native function pointer of the callback + il.Emit(OpCodes.Ldftn, typeof(Program).GetMethod("ManagedAddCallback")); il.Emit(OpCodes.Stloc_0); il.Emit(OpCodes.Ldloc_0); - il.Emit(OpCodes.Ldsfld, typeof(IntPtr).GetField("Zero")); - il.Emit(OpCodes.Call, typeof(NativeMethods).GetMethod("EnumWindows")); - il.Emit(OpCodes.Pop); + + // return 111+100 + il.Emit(OpCodes.Ldc_I4, 111); + il.Emit(OpCodes.Call, typeof(NativeMethods).GetMethod("CallManagedAdd")); il.Emit(OpCodes.Ret); - NativeMethodInvoker testNativeMethod = (NativeMethodInvoker)testNativeCallable.CreateDelegate(typeof(NativeMethodInvoker)); - testNativeMethod(); + IntNativeMethodInvoker testNativeMethod = (IntNativeMethodInvoker)testNativeCallable.CreateDelegate(typeof(IntNativeMethodInvoker)); + if (testNativeMethod() != 211) + return 0; + return 100; } public static void NegativeTest_ViaDelegate() @@ -68,8 +75,8 @@ public class Program // Try invoking method directly try { - Func<IntPtr, IntPtr, int> invoker = CallbackMethod; - invoker(IntPtr.Zero, IntPtr.Zero); + Func<int, int> invoker = ManagedAddCallback; + invoker(0); } catch (Exception) { @@ -134,10 +141,9 @@ public class Program } [NativeCallable] - public static int CallbackMethod(IntPtr hWnd, IntPtr lParam) + public static int ManagedAddCallback(int n) { - waitHandle.Set(); - return 1; + return n + 100; } [NativeCallable] @@ -153,4 +159,4 @@ public class Program } #endregion //callbacks -}
\ No newline at end of file +} diff --git a/tests/src/Interop/NativeCallable/NativeCallableTest.csproj b/tests/src/Interop/NativeCallable/NativeCallableTest.csproj index d2aa319a3e..744d8a925a 100644 --- a/tests/src/Interop/NativeCallable/NativeCallableTest.csproj +++ b/tests/src/Interop/NativeCallable/NativeCallableTest.csproj @@ -37,5 +37,9 @@ <ItemGroup> <Compile Include="NativeCallableTest.cs" /> </ItemGroup> + <ItemGroup> + <!-- This is needed to make sure native binary gets installed in the right location --> + <ProjectReference Include="CMakeLists.txt" /> + </ItemGroup> <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" /> -</Project>
\ No newline at end of file +</Project> |