215 lines
6.7 KiB
C#
215 lines
6.7 KiB
C#
// ==++==
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// ==--==
|
|
/*============================================================
|
|
**
|
|
** Class: FileLoadException
|
|
**
|
|
** <OWNER>[....]</OWNER>
|
|
** <OWNER>[....]</OWNER>
|
|
**
|
|
**
|
|
** 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.Security.Permissions;
|
|
using System.Runtime.Versioning;
|
|
using SecurityException = System.Security.SecurityException;
|
|
|
|
namespace System.IO {
|
|
|
|
[Serializable]
|
|
[System.Runtime.InteropServices.ComVisible(true)]
|
|
public 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(Environment.GetResourceString("IO.FileLoad")) {
|
|
SetErrorCode(__HResults.COR_E_FILELOAD);
|
|
}
|
|
|
|
public FileLoadException(String message)
|
|
: base(message) {
|
|
SetErrorCode(__HResults.COR_E_FILELOAD);
|
|
}
|
|
|
|
public FileLoadException(String message, Exception inner)
|
|
: base(message, inner) {
|
|
SetErrorCode(__HResults.COR_E_FILELOAD);
|
|
}
|
|
|
|
public FileLoadException(String message, String fileName) : base(message)
|
|
{
|
|
SetErrorCode(__HResults.COR_E_FILELOAD);
|
|
_fileName = fileName;
|
|
}
|
|
|
|
public FileLoadException(String message, String fileName, Exception inner)
|
|
: base(message, inner) {
|
|
SetErrorCode(__HResults.COR_E_FILELOAD);
|
|
_fileName = fileName;
|
|
}
|
|
|
|
public override String Message
|
|
{
|
|
get {
|
|
SetMessageField();
|
|
return _message;
|
|
}
|
|
}
|
|
|
|
private void SetMessageField()
|
|
{
|
|
if (_message == null)
|
|
_message = FormatFileLoadExceptionMessage(_fileName, HResult);
|
|
}
|
|
|
|
public String FileName {
|
|
get { return _fileName; }
|
|
}
|
|
|
|
#if FEATURE_LEGACYNETCF
|
|
// override Data property to populate FileLoadException with Hresult
|
|
public override System.Collections.IDictionary Data {
|
|
[System.Security.SecuritySafeCritical]
|
|
get {
|
|
var _data = base.Data;
|
|
if (CompatibilitySwitches.IsAppEarlierThanWindowsPhone8 && !_data.Contains("HResult"))
|
|
{
|
|
_data.Add("HResult", HResult);
|
|
}
|
|
return _data;
|
|
}
|
|
}
|
|
#endif //FEATURE_LEGACYNETCF
|
|
|
|
public override String ToString()
|
|
{
|
|
String s = GetType().FullName + ": " + Message;
|
|
|
|
if (_fileName != null && _fileName.Length != 0)
|
|
s += Environment.NewLine + Environment.GetResourceString("IO.FileName_Name", _fileName);
|
|
|
|
if (InnerException != null)
|
|
s = s + " ---> " + InnerException.ToString();
|
|
|
|
if (StackTrace != null)
|
|
s += Environment.NewLine + StackTrace;
|
|
|
|
#if FEATURE_FUSION
|
|
try
|
|
{
|
|
if(FusionLog!=null)
|
|
{
|
|
if (s==null)
|
|
s=" ";
|
|
s+=Environment.NewLine;
|
|
s+=Environment.NewLine;
|
|
s+=FusionLog;
|
|
}
|
|
}
|
|
catch(SecurityException)
|
|
{
|
|
|
|
}
|
|
#endif // FEATURE_FUSION
|
|
|
|
return s;
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
#if FEATURE_FUSION
|
|
public String FusionLog {
|
|
[System.Security.SecuritySafeCritical] // auto-generated
|
|
[SecurityPermissionAttribute( SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlEvidence | SecurityPermissionFlag.ControlPolicy)]
|
|
get { return _fusionLog; }
|
|
}
|
|
#endif // FEATURE_FUSION
|
|
|
|
#if FEATURE_SERIALIZATION
|
|
[System.Security.SecurityCritical] // auto-generated_required
|
|
public override void GetObjectData(SerializationInfo info, StreamingContext context) {
|
|
// Serialize data for our base classes. base will verify info != null.
|
|
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)
|
|
{
|
|
}
|
|
}
|
|
#endif
|
|
|
|
[System.Security.SecuritySafeCritical] // auto-generated
|
|
internal static String FormatFileLoadExceptionMessage(String fileName,
|
|
int hResult)
|
|
{
|
|
#if MONO
|
|
return string.Format (CultureInfo.InvariantCulture, "Could not load file or assembly '{0}' or one of its dependencies", fileName);
|
|
#else
|
|
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);
|
|
#endif
|
|
}
|
|
#if !MONO
|
|
[System.Security.SecurityCritical] // auto-generated
|
|
[ResourceExposure(ResourceScope.None)]
|
|
[DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
|
|
[SuppressUnmanagedCodeSecurity]
|
|
private static extern void GetFileLoadExceptionMessage(int hResult, StringHandleOnStack retString);
|
|
|
|
[System.Security.SecurityCritical] // auto-generated
|
|
[ResourceExposure(ResourceScope.None)]
|
|
[DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
|
|
[SuppressUnmanagedCodeSecurity]
|
|
private static extern void GetMessageForHR(int hresult, StringHandleOnStack retString);
|
|
#endif
|
|
}
|
|
}
|