Work around MCG bug around `ref char` marshalling (dotnet/corert#5481)
authorMichal Strehovský <MichalStrehovsky@users.noreply.github.com>
Fri, 2 Mar 2018 09:28:43 +0000 (10:28 +0100)
committerStephen Toub <stoub@microsoft.com>
Fri, 2 Mar 2018 13:04:22 +0000 (08:04 -0500)
The change in the P/invoke signature that came from CoreCLR triggers a bug in MCG on the TFS side.

Signed-off-by: dotnet-bot <dotnet-bot@microsoft.com>
src/mscorlib/shared/Interop/Windows/Kernel32/Interop.GetFullPathNameW.cs
src/mscorlib/shared/Interop/Windows/Kernel32/Interop.GetLongPathNameW.cs

index b4d4170..0603045 100644 (file)
@@ -13,6 +13,17 @@ internal partial class Interop
         /// WARNING: This method does not implicitly handle long paths. Use GetFullPathName or PathHelper.
         /// </summary>
         [DllImport(Libraries.Kernel32, SetLastError = true, CharSet = CharSet.Unicode, BestFitMapping = false, ExactSpelling = true)]
+#if PROJECTN
+        internal static extern unsafe uint GetFullPathNameW(string path, uint numBufferChars, char* buffer, IntPtr mustBeZero);
+
+        // Works around https://devdiv.visualstudio.com/web/wi.aspx?pcguid=011b8bdf-6d56-4f87-be0d-0092136884d9&id=575202
+        internal static unsafe uint GetFullPathNameW(string path, uint numBufferChars, ref char buffer, IntPtr mustBeZero)
+        {
+            fixed (char* pBuffer = &buffer)
+                return GetFullPathNameW(path, numBufferChars, pBuffer, mustBeZero);
+        }
+#else
         internal static extern uint GetFullPathNameW(string path, uint numBufferChars, ref char buffer, IntPtr mustBeZero);
+#endif
     }
 }
index 81b4d09..09e98d0 100644 (file)
@@ -13,6 +13,17 @@ internal partial class Interop
         /// WARNING: This method does not implicitly handle long paths. Use GetFullPath/PathHelper.
         /// </summary>
         [DllImport(Libraries.Kernel32, SetLastError = true, CharSet = CharSet.Unicode, BestFitMapping = false, ExactSpelling = true)]
+#if PROJECTN
+        internal static extern unsafe uint GetLongPathNameW(ref char lpszShortPath, char* lpszLongPath, uint cchBuffer);
+
+        // Works around https://devdiv.visualstudio.com/web/wi.aspx?pcguid=011b8bdf-6d56-4f87-be0d-0092136884d9&id=575202
+        internal static unsafe uint GetLongPathNameW(ref char lpszShortPath, ref char lpszLongPath, uint cchBuffer)
+        {
+            fixed (char* plpszLongPath = &lpszLongPath)
+                return GetLongPathNameW(ref lpszShortPath, plpszLongPath, cchBuffer);
+        }
+#else
         internal static extern uint GetLongPathNameW(ref char lpszShortPath, ref char lpszLongPath, uint cchBuffer);
+#endif
     }
 }