2007-07-08 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mcs / class / corlib / System / BadImageFormatException.cs
1 //
2 // System.BadImageFormatException.cs
3 //
4 // Authors:
5 //   Sean MacIsaac (macisaac@ximian.com)
6 //   Duncan Mak (duncan@ximian.com)
7 //   Andreas Nahr (ClassDevelopment@A-SoftTech.com)
8 //
9 // (C) 2001 Ximian, Inc.
10 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 // 
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 // 
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 //
31
32 using System.Globalization;
33 using System.Runtime.Serialization;
34 using System.Security.Permissions;
35 using System.Runtime.InteropServices;
36 using System.Text;
37
38 namespace System
39 {
40         [Serializable]
41 #if NET_2_0
42         [ComVisible (true)]
43 #endif
44         public class BadImageFormatException : SystemException
45         {
46                 const int Result = unchecked ((int)0x8007000B);
47
48                 // Fields
49                 private string fileName;
50                 private string fusionLog;
51
52                 // Constructors
53                 public BadImageFormatException ()
54                         : base (Locale.GetText ("Format of the executable (.exe) or library (.dll) is invalid."))
55                 {
56                         HResult = Result;
57                 }
58
59                 public BadImageFormatException (string message)
60                         : base (message)
61                 {
62                         HResult = Result;
63                 }
64
65                 protected BadImageFormatException (SerializationInfo info, StreamingContext context)
66                         : base (info, context)
67                 {
68                         fileName = info.GetString ("BadImageFormat_FileName");
69                         fusionLog = info.GetString ("BadImageFormat_FusionLog");
70                 }
71
72                 public BadImageFormatException (string message, Exception innerException)
73                         : base (message, innerException)
74                 {
75                         HResult = Result;
76                 }
77
78                 public BadImageFormatException (string message, string fileName)
79                         : base (message)
80                 {
81                         this.fileName = fileName;
82                         HResult = Result;
83                 }
84
85                 public BadImageFormatException (string message, string fileName, Exception innerException)
86                         : base (message, innerException)
87                 {
88                         this.fileName = fileName;
89                         HResult = Result;
90                 }
91
92                 // Properties
93                 public override string Message
94                 {
95                         get {
96                                 if (base.message == null) {
97 #if NET_2_0
98                                         return string.Format (CultureInfo.CurrentCulture,
99                                                 "Could not load file or assembly '{0}' or one of"
100                                                 + " its dependencies. An attempt was made to load"
101                                                 + " a program with an incorrect format.", fileName);
102 #else
103                                         if (fileName == null) {
104                                                 return "Format of the executable (.exe) or library"
105                                                         + " (.dll) is invalid.";
106                                         } else {
107                                                 return string.Format (CultureInfo.CurrentCulture,
108                                                         "The format of the file '{0}' is invalid.",
109                                                         FileName);
110                                         }
111 #endif
112                                 }
113                                 return base.Message;
114                         }
115                 }
116
117                 public string FileName
118                 {
119                         get { return fileName; }
120                 }
121
122                 [MonoTODO ("Probably not entirely correct. fusionLog needs to be set somehow (we are probably missing internal constuctor)")]
123                 public string FusionLog {
124                         // note: MS runtime throws a SecurityException when the Exception is created
125                         // but a FileLoadException once the exception as been thrown. Mono always
126                         // throw a SecurityException in both case (anyway fusionLog is currently empty)
127                         [SecurityPermission (SecurityAction.Demand, ControlEvidence=true, ControlPolicy=true)]
128                         get { return fusionLog; }
129                 }
130
131                 // Methods
132                 public override void GetObjectData (SerializationInfo info, StreamingContext context)
133                 {
134                         base.GetObjectData (info, context);
135                         info.AddValue ("BadImageFormat_FileName", fileName);
136                         info.AddValue ("BadImageFormat_FusionLog", fusionLog);
137                 }
138
139                 public override string ToString ()
140                 {
141                         StringBuilder sb = new StringBuilder (GetType ().FullName);
142                         sb.AppendFormat (": {0}", Message);
143
144                         if (fileName != null && fileName.Length > 0) {
145                                 sb.Append (Environment.NewLine);
146 #if NET_2_0
147                                 sb.AppendFormat ("File name: '{0}'", fileName);
148 #else
149                                 sb.AppendFormat ("File name: \"{0}\"", fileName);
150 #endif
151                         }
152
153                         if (this.InnerException != null)
154                                 sb.AppendFormat (" ---> {0}", InnerException);
155
156                         if (this.StackTrace != null) {
157                                 sb.Append (Environment.NewLine);
158                                 sb.Append (StackTrace);
159                         }
160
161                         return sb.ToString ();
162                 }
163         }
164 }