diff options
author | Michal Strehovský <MichalStrehovsky@users.noreply.github.com> | 2018-03-02 12:28:43 +0300 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2018-03-02 12:28:43 +0300 |
commit | 0df42ba839844da4fa4fc6a391af452b266f8ebb (patch) | |
tree | 254a529b397c6afdc33fdbd462683399de05505a | |
parent | ed0b32ee6b2c3c9d7c9e1c21ca019cd60278f861 (diff) |
Work around MCG bug around `ref char` marshalling (#5481)
The change in the P/invoke signature that came from CoreCLR triggers a bug in MCG on the TFS side.
-rw-r--r-- | src/System.Private.CoreLib/shared/Interop/Windows/Kernel32/Interop.GetFullPathNameW.cs | 11 | ||||
-rw-r--r-- | src/System.Private.CoreLib/shared/Interop/Windows/Kernel32/Interop.GetLongPathNameW.cs | 11 |
2 files changed, 22 insertions, 0 deletions
diff --git a/src/System.Private.CoreLib/shared/Interop/Windows/Kernel32/Interop.GetFullPathNameW.cs b/src/System.Private.CoreLib/shared/Interop/Windows/Kernel32/Interop.GetFullPathNameW.cs index b4d4170ae..06030450c 100644 --- a/src/System.Private.CoreLib/shared/Interop/Windows/Kernel32/Interop.GetFullPathNameW.cs +++ b/src/System.Private.CoreLib/shared/Interop/Windows/Kernel32/Interop.GetFullPathNameW.cs @@ -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 } } diff --git a/src/System.Private.CoreLib/shared/Interop/Windows/Kernel32/Interop.GetLongPathNameW.cs b/src/System.Private.CoreLib/shared/Interop/Windows/Kernel32/Interop.GetLongPathNameW.cs index 81b4d096f..09e98d0c9 100644 --- a/src/System.Private.CoreLib/shared/Interop/Windows/Kernel32/Interop.GetLongPathNameW.cs +++ b/src/System.Private.CoreLib/shared/Interop/Windows/Kernel32/Interop.GetLongPathNameW.cs @@ -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 } } |