Clean up and prepare FileLoadException.cs for move to Shared Partition. (#10764)
authorAtsushi Kanamori <AtsushiKan@users.noreply.github.com>
Thu, 6 Apr 2017 14:45:58 +0000 (07:45 -0700)
committerGitHub <noreply@github.com>
Thu, 6 Apr 2017 14:45:58 +0000 (07:45 -0700)
* String => string

* Replace fields with autoprops.

* Turn Type.FullName call to Type.ToString() in ToString().

Avoids MissingMetadataExceptions on CoreRT.

Assuming metadata exists, ToString() and FullName()
still generates the same string except in the weird
case where an app subclasses FileLoadException
with a generic exception type - in which case,
the ToString() version is actually more readable.

* Get rid of useless try-catch around FusionLog calls.

FusionLog is now just a normal property and an answer
to a trivia question - it won't throw SecurityException.

* Get rid of low-value SetMessageField() middleman.

* Split off the stuff we don't want to share.

* The complementary carwash...

* Don't conditionalize FusionLog serialization.

src/mscorlib/System.Private.CoreLib.csproj
src/mscorlib/src/System/IO/FileLoadException.CoreCLR.cs [new file with mode: 0644]
src/mscorlib/src/System/IO/FileLoadException.cs

index 41c7b9e..0012572 100644 (file)
     <Compile Include="$(BclSourcesRoot)\System\IO\File.cs" />
     <Compile Include="$(BclSourcesRoot)\System\IO\FileAccess.cs" />
     <Compile Include="$(BclSourcesRoot)\System\IO\FileLoadException.cs" />
+    <Compile Include="$(BclSourcesRoot)\System\IO\FileLoadException.CoreCLR.cs" />
     <Compile Include="$(BclSourcesRoot)\System\IO\FileMode.cs" />
     <Compile Include="$(BclSourcesRoot)\System\IO\FileNotFoundException.cs" />
     <Compile Include="$(BclSourcesRoot)\System\IO\FileOptions.cs" />
diff --git a/src/mscorlib/src/System/IO/FileLoadException.CoreCLR.cs b/src/mscorlib/src/System/IO/FileLoadException.CoreCLR.cs
new file mode 100644 (file)
index 0000000..18bd82f
--- /dev/null
@@ -0,0 +1,43 @@
+// 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.
+
+using System.Globalization;
+using System.Runtime.InteropServices;
+using System.Runtime.CompilerServices;
+using System.Security;
+
+namespace System.IO
+{
+    public partial class FileLoadException
+    {
+        // Do not delete: this is invoked from native code.
+        private FileLoadException(string fileName, string fusionLog, int hResult)
+            : base(null)
+        {
+            SetErrorCode(hResult);
+            FileName = fileName;
+            FusionLog = fusionLog;
+            _message = FormatFileLoadExceptionMessage(FileName, HResult);
+        }
+
+        internal static string FormatFileLoadExceptionMessage(string fileName, int hResult)
+        {
+            string format = null;
+            GetFileLoadExceptionMessage(hResult, JitHelpers.GetStringHandleOnStack(ref format));
+
+            string message = null;
+            GetMessageForHR(hResult, JitHelpers.GetStringHandleOnStack(ref message));
+
+            return string.Format(CultureInfo.CurrentCulture, format, fileName, message);
+        }
+
+        [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+        [SuppressUnmanagedCodeSecurity]
+        private static extern void GetFileLoadExceptionMessage(int hResult, StringHandleOnStack retString);
+
+        [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
+        [SuppressUnmanagedCodeSecurity]
+        private static extern void GetMessageForHR(int hresult, StringHandleOnStack retString);
+    }
+}
index 6c5b268..a4b68a8 100644 (file)
@@ -2,92 +2,65 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
-/*============================================================
-**
-**
-** 
-** 
-**
-**
-** Purpose: Exception for failure to load a file that was successfully found.
-**
-**
-===========================================================*/
-
-using System;
-using System.Globalization;
 using System.Runtime.Serialization;
-using System.Runtime.InteropServices;
-using System.Runtime.CompilerServices;
-using System.Security;
-using System.Runtime.Versioning;
-using SecurityException = System.Security.SecurityException;
 
 namespace System.IO
 {
     [Serializable]
-    public class FileLoadException : IOException
+    public partial class FileLoadException : IOException
     {
-        private String _fileName;   // the name of the file we could not load.
-        private String _fusionLog;  // fusion log (when applicable)
-
         public FileLoadException()
             : base(SR.IO_FileLoad)
         {
             SetErrorCode(__HResults.COR_E_FILELOAD);
         }
 
-        public FileLoadException(String message)
+        public FileLoadException(string message)
             : base(message)
         {
             SetErrorCode(__HResults.COR_E_FILELOAD);
         }
 
-        public FileLoadException(String message, Exception inner)
+        public FileLoadException(string message, Exception inner)
             : base(message, inner)
         {
             SetErrorCode(__HResults.COR_E_FILELOAD);
         }
 
-        public FileLoadException(String message, String fileName) : base(message)
+        public FileLoadException(string message, string fileName) : base(message)
         {
             SetErrorCode(__HResults.COR_E_FILELOAD);
-            _fileName = fileName;
+            FileName = fileName;
         }
 
-        public FileLoadException(String message, String fileName, Exception inner)
+        public FileLoadException(string message, string fileName, Exception inner)
             : base(message, inner)
         {
             SetErrorCode(__HResults.COR_E_FILELOAD);
-            _fileName = fileName;
+            FileName = fileName;
         }
 
-        public override String Message
+        public override string Message
         {
             get
             {
-                SetMessageField();
+                if (_message == null)
+                {
+                    _message = FormatFileLoadExceptionMessage(FileName, HResult);
+                }
                 return _message;
             }
         }
 
-        private void SetMessageField()
-        {
-            if (_message == null)
-                _message = FormatFileLoadExceptionMessage(_fileName, HResult);
-        }
+        public string FileName { get; }
+        public string FusionLog { get; }
 
-        public String FileName
+        public override string ToString()
         {
-            get { return _fileName; }
-        }
-
-        public override String ToString()
-        {
-            String s = GetType().FullName + ": " + Message;
+            string s = GetType().ToString() + ": " + Message;
 
-            if (_fileName != null && _fileName.Length != 0)
-                s += Environment.NewLine + SR.Format(SR.IO_FileName_Name, _fileName);
+            if (FileName != null && FileName.Length != 0)
+                s += Environment.NewLine + SR.Format(SR.IO_FileName_Name, FileName);
 
             if (InnerException != null)
                 s = s + " ---> " + InnerException.ToString();
@@ -95,52 +68,25 @@ namespace System.IO
             if (StackTrace != null)
                 s += Environment.NewLine + StackTrace;
 
-            try
-            {
-                if (FusionLog != null)
-                {
-                    if (s == null)
-                        s = " ";
-                    s += Environment.NewLine;
-                    s += Environment.NewLine;
-                    s += FusionLog;
-                }
-            }
-            catch (SecurityException)
+            if (FusionLog != null)
             {
+                if (s == null)
+                    s = " ";
+                s += Environment.NewLine;
+                s += Environment.NewLine;
+                s += FusionLog;
             }
 
             return s;
         }
 
-        protected FileLoadException(SerializationInfo info, StreamingContext context) : base(info, context)
+        protected FileLoadException(SerializationInfo info, StreamingContext context)
+            : base(info, context)
         {
             // Base class constructor will check info != null.
 
-            _fileName = info.GetString("FileLoad_FileName");
-
-            try
-            {
-                _fusionLog = info.GetString("FileLoad_FusionLog");
-            }
-            catch
-            {
-                _fusionLog = null;
-            }
-        }
-
-        private FileLoadException(String fileName, String fusionLog, int hResult)
-            : base(null)
-        {
-            SetErrorCode(hResult);
-            _fileName = fileName;
-            _fusionLog = fusionLog;
-            SetMessageField();
-        }
-
-        public String FusionLog
-        {
-            get { return _fusionLog; }
+            FileName = info.GetString("FileLoad_FileName");
+            FusionLog = info.GetString("FileLoad_FusionLog");
         }
 
         public override void GetObjectData(SerializationInfo info, StreamingContext context)
@@ -149,35 +95,8 @@ namespace System.IO
             base.GetObjectData(info, context);
 
             // Serialize data for this class
-            info.AddValue("FileLoad_FileName", _fileName, typeof(String));
-
-            try
-            {
-                info.AddValue("FileLoad_FusionLog", FusionLog, typeof(String));
-            }
-            catch (SecurityException)
-            {
-            }
-        }
-
-        internal static String FormatFileLoadExceptionMessage(String fileName,
-            int hResult)
-        {
-            string format = null;
-            GetFileLoadExceptionMessage(hResult, JitHelpers.GetStringHandleOnStack(ref format));
-
-            string message = null;
-            GetMessageForHR(hResult, JitHelpers.GetStringHandleOnStack(ref message));
-
-            return String.Format(CultureInfo.CurrentCulture, format, fileName, message);
+            info.AddValue("FileLoad_FileName", FileName, typeof(string));
+            info.AddValue("FileLoad_FusionLog", FusionLog, typeof(string));
         }
-
-        [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
-        [SuppressUnmanagedCodeSecurity]
-        private static extern void GetFileLoadExceptionMessage(int hResult, StringHandleOnStack retString);
-
-        [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
-        [SuppressUnmanagedCodeSecurity]
-        private static extern void GetMessageForHR(int hresult, StringHandleOnStack retString);
     }
 }