Imported Upstream version 4.6.0.243

Former-commit-id: ff34202749e8df2aa83f2578b16260b444f50987
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2016-09-09 07:19:48 +00:00
parent 804b15604f
commit 3cc9601fd9
113 changed files with 1476 additions and 4439 deletions

View File

@@ -125,9 +125,9 @@ namespace Mono.Data.Sqlite
// Compatibility with versions < 3.5.0
int n;
try {
if (UnsafeNativeMethods.use_sqlite3_open_v2) {
n = UnsafeNativeMethods.sqlite3_open_v2(ToUTF8(strFilename), out db, (int)flags, IntPtr.Zero);
} catch (EntryPointNotFoundException) {
} else {
Console.WriteLine ("Your sqlite3 version is old - please upgrade to at least v3.5.0!");
n = UnsafeNativeMethods.sqlite3_open (ToUTF8 (strFilename), out db);
}

View File

@@ -208,9 +208,9 @@ namespace Mono.Data.Sqlite
#else
ResetConnection(db);
int n;
try {
if (UnsafeNativeMethods.use_sqlite3_close_v2) {
n = UnsafeNativeMethods.sqlite3_close_v2(db);
} catch (EntryPointNotFoundException) {
} else {
n = UnsafeNativeMethods.sqlite3_close(db);
}
#endif

View File

@@ -16,6 +16,27 @@ namespace Mono.Data.Sqlite
#endif
internal static class UnsafeNativeMethods
{
internal static readonly bool use_sqlite3_close_v2 = false;
internal static readonly bool use_sqlite3_open_v2 = false;
internal static readonly bool use_sqlite3_create_function_v2 = false;
static UnsafeNativeMethods()
{
// calculate the version number parts
// https://www.sqlite.org/c3ref/c_source_id.html
// (<major> * 1000000) + (<minor> * 1000) + (<release>)
int versionNumber = sqlite3_libversion_number();
int release = versionNumber % 1000;
int minor = (versionNumber / 1000) % 1000;
int major = versionNumber / 1000000;
Version version = new Version(major, minor, release);
// set the various versions
// https://sqlite.org/changes.html
use_sqlite3_open_v2 = version >= new Version(3, 5, 0);
use_sqlite3_close_v2 = version >= new Version(3, 7, 14);
use_sqlite3_create_function_v2 = version >= new Version(3, 7, 3);
}
#if !SQLITE_STANDARD
#if !USE_INTEROP_DLL
@@ -730,6 +751,13 @@ namespace Mono.Data.Sqlite
#endif
internal static extern int sqlite3_free (IntPtr ptr);
#if !PLATFORM_COMPACTFRAMEWORK
[DllImport(SQLITE_DLL, CallingConvention = CallingConvention.Cdecl)]
#else
[DllImport(SQLITE_DLL)]
#endif
internal static extern int sqlite3_libversion_number();
#endregion
}

View File

@@ -21,10 +21,15 @@ System.IO.Pipes/AnonymousPipeClientStream.cs
System.IO.Pipes/AnonymousPipeServerStream.cs
System.IO.Pipes/NamedPipeClientStream.cs
System.IO.Pipes/NamedPipeServerStream.cs
System.IO.Pipes/PipeAccessRights.cs
System.IO.Pipes/PipeAccessRule.cs
System.IO.Pipes/PipeAuditRule.cs
System.IO.Pipes/PipeDirection.cs
System.IO.Pipes/PipeInterfaces.cs
System.IO.Pipes/PipeOptions.cs
System.IO.Pipes/PipeSecurity.cs
System.IO.Pipes/PipeStream.cs
System.IO.Pipes/PipeStreamImpersonationWorker.cs
System.IO.Pipes/PipeTransmissionMode.cs
ReferenceSources/SR.cs

View File

@@ -1,11 +1,6 @@
#include common_System.Core.dll.sources
#include dynamic_System.Core.dll.sources
System.IO.Pipes/PipeAccessRights.cs
System.IO.Pipes/PipeAccessRule.cs
System.IO.Pipes/PipeAuditRule.cs
System.IO.Pipes/PipeSecurity.cs
System.IO.Pipes/PipeStreamImpersonationWorker.cs
System.IO.Pipes/PipeUnix.cs
System.IO.Pipes/PipeWin32.cs

View File

@@ -450,7 +450,7 @@ namespace System.Net
newWebHeaders.Add(headerName,webHeaders[headerName]);
}
webHeaders = newWebHeaders;
this.webHeaders = newWebHeaders;
}
}

View File

@@ -1,25 +0,0 @@
using System;
using System.Runtime.InteropServices;
namespace Microsoft.Win32.SafeHandles
{
public sealed class SafeAccessTokenHandle : SafeHandle
{
public override bool IsInvalid {
get {
return handle == IntPtr.Zero;
}
}
public SafeAccessTokenHandle ()
: base (IntPtr.Zero, true)
{
}
protected override bool ReleaseHandle()
{
return true;
}
}
}

View File

@@ -157,7 +157,11 @@ internal class Latin1Encoding : Encoding
buffer = EncoderFallback.CreateFallbackBuffer ();
if (Char.IsSurrogate (ch) && count > 1 &&
Char.IsSurrogate (chars [charIndex]))
buffer.Fallback (ch, chars [charIndex], charIndex++ - 1);
{
buffer.Fallback (ch, chars [charIndex], charIndex - 1);
charIndex++;
count--;
}
else
buffer.Fallback (ch, charIndex - 1);
if (fallback_chars == null || fallback_chars.Length < buffer.Remaining)

View File

@@ -862,6 +862,22 @@ namespace System {
}
}
#else
public static string GetEnvironmentVariable (string variable, EnvironmentVariableTarget target)
{
if (target == EnvironmentVariableTarget.Process)
return GetEnvironmentVariable (variable);
return null;
}
public static IDictionary GetEnvironmentVariables (EnvironmentVariableTarget target)
{
if (target == EnvironmentVariableTarget.Process)
return GetEnvironmentVariables ();
return (IDictionary)new Hashtable ();
}
public static void SetEnvironmentVariable (string variable, string value)
{
if (variable == null)
@@ -875,6 +891,14 @@ namespace System {
InternalSetEnvironmentVariable (variable, value);
}
public static void SetEnvironmentVariable (string variable, string value, EnvironmentVariableTarget target)
{
if (target == EnvironmentVariableTarget.Process)
SetEnvironmentVariable (variable, value);
// other targets ignored
}
#endif
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal static extern void InternalSetEnvironmentVariable (string variable, string value);

View File

@@ -119,6 +119,40 @@ namespace MonoTests.System.Text
Assert.AreEqual (testchars [i], (char) bytes [i]);
}
[Test] // Test GetBytes(string)
public void TestGetBytes7 ()
{
var latin1_encoding = Encoding.GetEncoding ("latin1");
var expected = new byte [] { 0x3F, 0x20, 0x3F, 0x20, 0x3F };
var actual = latin1_encoding.GetBytes("\u24c8 \u2075 \u221e"); // normal replacement
Assert.AreEqual (expected, actual, "#1");
expected = new byte [] { 0x3F, 0x3F };
actual = latin1_encoding.GetBytes("\ud83d\ude0a"); // surrogate pair replacement
Assert.AreEqual (expected, actual, "#2");
expected = new byte [] { 0x3F, 0x3F, 0x20 };
actual = latin1_encoding.GetBytes("\ud83d\ude0a "); // surrogate pair replacement
Assert.AreEqual (expected, actual, "#3");
expected = new byte [] { 0x20, 0x20, 0x3F, 0x3F, 0x20, 0x20 };
actual = latin1_encoding.GetBytes(" \ud83d\ude0a "); // surrogate pair replacement
Assert.AreEqual (expected, actual, "#4");
expected = new byte [] { 0x20, 0x20, 0x3F, 0x3F, 0x20, 0x20 };
actual = latin1_encoding.GetBytes(" \ud834\udd1e "); // surrogate pair replacement
Assert.AreEqual (expected, actual, "#5");
expected = new byte [] { 0x41, 0x42, 0x43, 0x00, 0x41, 0x42, 0x43 };
actual = latin1_encoding.GetBytes("ABC\0ABC"); // embedded zero byte not replaced
Assert.AreEqual (expected, actual, "#6");
expected = new byte [] { 0x20, 0x20, 0x3F, 0x20, 0x20 };
actual = latin1_encoding.GetBytes(" \ud834 "); // invalid surrogate pair replacement
Assert.AreEqual (expected, actual, "#7");
}
[Test] // Test GetChars(byte[])
public void TestGetChars1 ()
{
@@ -212,6 +246,15 @@ namespace MonoTests.System.Text
Assert.AreEqual (string.Empty, encoding.GetString (new byte [0], 0, 0), "#2");
}
[Test]
[ExpectedException (typeof (EncoderFallbackException))]
public void EncoderFallback ()
{
Encoding e = Encoding.ASCII.Clone () as Encoding;
e.EncoderFallback = new EncoderExceptionFallback ();
e.GetBytes ("\u24c8");
}
[Test]
[ExpectedException (typeof (DecoderFallbackException))]
public void DecoderFallback ()

View File

@@ -0,0 +1,350 @@
//
// Latin1EncodingTest.cs
//
// Author:
// Alexander Köplinger (alexander.koeplinger@xamarin.com)
//
// Copyright (C) 2016 Xamarin, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
using System;
using System.Text;
using NUnit.Framework;
using NUnit.Framework.Constraints;
#if !MOBILE
using NUnit.Framework.SyntaxHelpers;
#endif
namespace MonoTests.System.Text
{
[TestFixture]
public class Latin1EncodingTest
{
private char[] testchars;
private byte[] testbytes;
[SetUp]
public void SetUp ()
{
testchars = new char[4];
testchars[0] = 'T';
testchars[1] = 'e';
testchars[2] = 's';
testchars[3] = 't';
testbytes = new byte[4];
testbytes[0] = (byte) 'T';
testbytes[1] = (byte) 'e';
testbytes[2] = (byte) 's';
testbytes[3] = (byte) 't';
}
[Test]
public void IsBrowserDisplay ()
{
Assert.IsTrue (Encoding.GetEncoding ("latin1").IsBrowserDisplay);
}
[Test]
public void IsBrowserSave ()
{
Assert.IsTrue (Encoding.GetEncoding ("latin1").IsBrowserSave);
}
[Test]
public void IsMailNewsDisplay ()
{
Assert.IsTrue (Encoding.GetEncoding ("latin1").IsMailNewsDisplay);
}
[Test]
public void IsMailNewsSave ()
{
Assert.IsTrue (Encoding.GetEncoding ("latin1").IsMailNewsSave);
}
[Test] // Test GetBytes(char[])
public void TestGetBytes1 ()
{
Encoding latin1_encoding = Encoding.GetEncoding ("latin1");
byte[] bytes = latin1_encoding.GetBytes(testchars);
for (int i = 0; i < testchars.Length; i++)
Assert.AreEqual (testchars[i], (char) bytes[i]);
}
[Test] // Test GetBytes(char[], int, int)
public void TestGetBytes2 ()
{
Encoding latin1_encoding = Encoding.GetEncoding ("latin1");
byte[] bytes = latin1_encoding.GetBytes(testchars, 1, 1);
Assert.AreEqual (1, bytes.Length, "#1");
Assert.AreEqual (testchars [1], (char) bytes [0], "#2");
}
[Test] // Test non-Latin1 char in char[]
public void TestGetBytes3 ()
{
Encoding latin1_encoding = Encoding.GetEncoding ("latin1");
testchars[2] = (char) 0x100;
byte[] bytes = latin1_encoding.GetBytes(testchars);
Assert.AreEqual ('T', (char) bytes [0], "#1");
Assert.AreEqual ('e', (char) bytes [1], "#2");
Assert.AreEqual ('?', (char) bytes [2], "#3");
Assert.AreEqual ('t', (char) bytes [3], "#4");
}
[Test] // Test GetBytes(char[], int, int, byte[], int)
public void TestGetBytes4 ()
{
Encoding latin1_encoding = Encoding.GetEncoding ("latin1");
byte[] bytes = new Byte[1];
int cnt = latin1_encoding.GetBytes(testchars, 1, 1, bytes, 0);
Assert.AreEqual (1, cnt, "#1");
Assert.AreEqual (testchars [1], (char) bytes [0], "#2");
}
[Test] // Test GetBytes(string, int, int, byte[], int)
public void TestGetBytes5 ()
{
Encoding latin1_encoding = Encoding.GetEncoding ("latin1");
byte[] bytes = new Byte[1];
int cnt = latin1_encoding.GetBytes("Test", 1, 1, bytes, 0);
Assert.AreEqual ('e', (char) bytes [0], "#1");
}
[Test] // Test GetBytes(string)
public void TestGetBytes6 ()
{
Encoding latin1_encoding = Encoding.GetEncoding ("latin1");
byte[] bytes = latin1_encoding.GetBytes("Test");
for (int i = 0; i < testchars.Length; i++)
Assert.AreEqual (testchars [i], (char) bytes [i]);
}
[Test] // Test GetBytes(string)
public void TestGetBytes7 ()
{
var latin1_encoding = Encoding.GetEncoding ("latin1");
var expected = new byte [] { 0x3F, 0x20, 0x3F, 0x20, 0x3F };
var actual = latin1_encoding.GetBytes("\u24c8 \u2075 \u221e"); // normal replacement
Assert.AreEqual (expected, actual, "#1");
expected = new byte [] { 0x3F, 0x3F };
actual = latin1_encoding.GetBytes("\ud83d\ude0a"); // surrogate pair replacement
Assert.AreEqual (expected, actual, "#2");
expected = new byte [] { 0x3F, 0x3F, 0x20 };
actual = latin1_encoding.GetBytes("\ud83d\ude0a "); // surrogate pair replacement
Assert.AreEqual (expected, actual, "#3");
expected = new byte [] { 0x20, 0x20, 0x3F, 0x3F, 0x20, 0x20 };
actual = latin1_encoding.GetBytes(" \ud83d\ude0a "); // surrogate pair replacement
Assert.AreEqual (expected, actual, "#4");
expected = new byte [] { 0x20, 0x20, 0x3F, 0x3F, 0x20, 0x20 };
actual = latin1_encoding.GetBytes(" \ud834\udd1e "); // surrogate pair replacement
Assert.AreEqual (expected, actual, "#5");
expected = new byte [] { 0x41, 0x42, 0x43, 0x00, 0x41, 0x42, 0x43 };
actual = latin1_encoding.GetBytes("ABC\0ABC"); // embedded zero byte not replaced
Assert.AreEqual (expected, actual, "#6");
expected = new byte [] { 0x20, 0x20, 0x3F, 0x20, 0x20 };
actual = latin1_encoding.GetBytes(" \ud834 "); // invalid surrogate pair replacement
Assert.AreEqual (expected, actual, "#7");
}
[Test] // Test GetChars(byte[])
public void TestGetChars1 ()
{
Encoding latin1_encoding = Encoding.GetEncoding ("latin1");
char[] chars = latin1_encoding.GetChars(testbytes);
for (int i = 0; i < testbytes.Length; i++)
Assert.AreEqual (testbytes[i], (byte) chars[i]);
}
[Test] // Test GetChars(byte[], int, int)
public void TestGetChars2 ()
{
Encoding latin1_encoding = Encoding.GetEncoding ("latin1");
char[] chars = latin1_encoding.GetChars(testbytes, 1, 1);
Assert.AreEqual (1, chars.Length, "#1");
Assert.AreEqual (testbytes [1], (byte) chars [0], "#2");
}
[Test] // Test GetChars(byte[], int, int, char[], int)
public void TestGetChars4 ()
{
Encoding latin1_encoding = Encoding.GetEncoding ("latin1");
char[] chars = new char[1];
int cnt = latin1_encoding.GetChars(testbytes, 1, 1, chars, 0);
Assert.AreEqual (1, cnt, "#1");
Assert.AreEqual (testbytes [1], (byte) chars [0], "#2");
}
[Test] // Test GetString(char[])
public void TestGetString1 ()
{
Encoding latin1_encoding = Encoding.GetEncoding ("latin1");
string str = latin1_encoding.GetString(testbytes);
Assert.AreEqual ("Test", str);
}
[Test] // Test GetString(char[], int, int)
public void TestGetString2 ()
{
Encoding latin1_encoding = Encoding.GetEncoding ("latin1");
string str = latin1_encoding.GetString(testbytes, 1, 2);
Assert.AreEqual ("es", str);
}
[Test] // Test Decoder
public void TestDecoder ()
{
Encoding latin1_encoding = Encoding.GetEncoding ("latin1");
char[] chars = new char[1];
int cnt = latin1_encoding.GetDecoder().GetChars(testbytes, 1, 1, chars, 0);
Assert.AreEqual (1, cnt, "#1");
Assert.AreEqual (testbytes [1], (byte) chars [0], "#2");
}
[Test] // Test Decoder
public void TestEncoder ()
{
Encoding latin1_encoding = Encoding.GetEncoding ("latin1");
byte[] bytes = new Byte[1];
int cnt = latin1_encoding.GetEncoder().GetBytes(testchars, 1, 1, bytes, 0, false);
Assert.AreEqual (1, cnt, "#1");
Assert.AreEqual (testchars [1], (char) bytes [0], "#2");
}
[Test]
public void TestZero ()
{
Encoding encoding = Encoding.GetEncoding ("latin1");
Assert.AreEqual (string.Empty, encoding.GetString (new byte [0]), "#1");
Assert.AreEqual (string.Empty, encoding.GetString (new byte [0], 0, 0), "#2");
}
[Test]
[ExpectedException (typeof (EncoderFallbackException))]
public void EncoderFallback ()
{
Encoding e = Encoding.GetEncoding ("latin1").Clone () as Encoding;
e.EncoderFallback = new EncoderExceptionFallback ();
e.GetBytes ("\u24c8");
}
[Test]
// [ExpectedException (typeof (ArgumentException))]
public void DecoderFallback2 ()
{
var bytes = new byte[] {
0x30, 0xa0, 0x31, 0xa8
};
var enc = (Encoding)Encoding.GetEncoding ("latin1").Clone ();
enc.DecoderFallback = new TestFallbackDecoder ();
var chars = new char [7];
var ret = enc.GetChars (bytes, 0, bytes.Length, chars, 0);
Console.WriteLine (ret);
for (int i = 0; i < chars.Length; i++) {
Console.Write ("{0:x2} ", (int)chars [i]);
}
Console.WriteLine ();
}
[Test]
public void DecoderFallback3 ()
{
var bytes = new byte[] {
0x30, 0xa0, 0x31, 0xa8
};
var enc = (Encoding)Encoding.GetEncoding ("latin1").Clone ();
enc.DecoderFallback = new TestFallbackDecoder ();
var chars = new char[] { '9', '8', '7', '6', '5' };
var ret = enc.GetChars (bytes, 0, bytes.Length, chars, 0);
Assert.That (ret, Is.EqualTo (4), "ret");
Assert.That (chars [0], Is.EqualTo ('0'), "chars[0]");
Assert.That (chars [1], Is.EqualTo ((char)0xA0), "chars[1]");
Assert.That (chars [2], Is.EqualTo ('1'), "chars[2]");
Assert.That (chars [3], Is.EqualTo ((char)0xA8), "chars[3]");
Assert.That (chars [4], Is.EqualTo ('5'), "chars[4]");
}
class TestFallbackDecoder : DecoderFallback {
const int count = 2;
public override int MaxCharCount {
get { return count; }
}
public override DecoderFallbackBuffer CreateFallbackBuffer ()
{
return new Buffer ();
}
class Buffer : DecoderFallbackBuffer {
char[] queue;
int index;
public override int Remaining {
get {
return queue.Length - index;
}
}
public override char GetNextChar ()
{
return index < queue.Length ? queue [index++] : '\0';
}
public override bool Fallback (byte[] bytes, int unused)
{
queue = new char[bytes.Length * count];
index = 0;
for (int i = 0; i < bytes.Length; i++) {
for (int j = 0; j < count; j++)
queue [index++] = (char)(bytes [i]+j);
}
return true;
}
public override bool MovePrevious ()
{
throw new NotImplementedException ();
}
public override void Reset ()
{
base.Reset ();
}
}
}
}
}

View File

@@ -615,7 +615,6 @@ System.Security/NamedPermissionSet.cs
System.Security/PermissionBuilder.cs
System.Security/PermissionSet.cs
System.Security/PolicyLevelType.cs
System.Security/SafeAccessTokenHandle.cs
System.Security/SecureString.cs
System.Security/SecurityElement.cs
System.Security/SecurityFrame.cs
@@ -1393,6 +1392,7 @@ ReferenceSources/SecurityContext.cs
../referencesource/mscorlib/system/security/attributes.cs
../referencesource/mscorlib/system/security/securitycontext.cs
../referencesource/mscorlib/system/security/securitydocument.cs
../referencesource/mscorlib/system/security/safesecurityhandles.cs
../referencesource/mscorlib/system/security/claims/Claim.cs
../referencesource/mscorlib/system/security/claims/ClaimsIdentity.cs

View File

@@ -405,6 +405,7 @@ System.Text/EncoderTest.cs
System.Text/EncodingTest.cs
System.Text/EncodingTester.cs
System.Text/EncodingInfoTest.cs
System.Text/Latin1EncodingTest.cs
System.Text/StringBuilderTest.cs
System.Text/TestEncoding.cs
System.Text/UnicodeEncodingTest.cs

View File

@@ -501,6 +501,44 @@ namespace System.Dynamic {
binder.ReturnType
);
#if MONO // referencesource version
Expression condition;
// If the return type can not be assigned null then just check for type assignablity otherwise allow null.
if (binder.ReturnType.IsValueType && Nullable.GetUnderlyingType(binder.ReturnType) == null) {
condition = Expression.TypeIs(resultMO.Expression, binder.ReturnType);
}
else {
condition = Expression.OrElse(
Expression.Equal(resultMO.Expression, Expression.Constant(null)),
Expression.TypeIs(resultMO.Expression, binder.ReturnType));
}
var checkedConvert = Expression.Condition(
condition,
convert,
Expression.Throw(
Expression.New(typeof(InvalidCastException).GetConstructor(new Type[]{typeof(string)}),
Expression.Call(
typeof(string).GetMethod("Format", new Type[] {typeof(string), typeof(object[])}),
Expression.Constant(convertFailed),
Expression.NewArrayInit(typeof(object),
Expression.Condition(
Expression.Equal(resultMO.Expression, Expression.Constant(null)),
Expression.Constant("null"),
Expression.Call(
resultMO.Expression,
typeof(object).GetMethod("GetType")
),
typeof(object)
)
)
)
),
binder.ReturnType
),
binder.ReturnType
);
#else
var checkedConvert = Expression.Condition(
Expression.TypeIs(resultMO.Expression, binder.ReturnType),
convert,
@@ -524,6 +562,7 @@ namespace System.Dynamic {
),
binder.ReturnType
);
#endif
resultMO = new DynamicMetaObject(checkedConvert, resultMO.Restrictions);
}

View File

@@ -1 +1 @@
0e58c3fba67bf21766014677b5f894f7637162d9
c490c7433c000c0ca9ff7be0753080941738fdbc

View File

@@ -1 +1 @@
8ad53def268a4750474dee2731ef4039642458aa
c3bbfb8e3d0bb1d4648a456800a8f616d8a28016

View File

@@ -1 +1 @@
4ed6e201e6785a6e9e44a113d2be4c9fd569673c
8410f10f87dea9524681b3f688dab2f70afbf9b5

View File

@@ -1 +1 @@
9d728aa18a9d89c58a94469c86f374658f784ccd
d2b12594e92c61982d88980ec4bfaeb7c3bdf9ab

View File

@@ -38,7 +38,11 @@ namespace Microsoft.Win32.SafeHandles {
[SecurityCritical]
protected override bool ReleaseHandle()
{
#if MONO
return true;
#else
return Win32Native.CloseHandle(handle);
#endif
}
}