Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / clr / src / BCL / System / Diagnostics / Stackframe.cs / 1 / Stackframe.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
namespace System.Diagnostics {
using System.Text;
using System;
using System.IO;
using System.Reflection;
using System.Security.Permissions;
// There is no good reason for the methods of this class to be virtual.
// In order to ensure trusted code can trust the data it gets from a
// StackTrace, we use an InheritanceDemand to prevent partially-trusted
// subclasses.
[SecurityPermission(SecurityAction.InheritanceDemand, UnmanagedCode=true)]
[Serializable()]
[System.Runtime.InteropServices.ComVisible(true)]
public class StackFrame
{
private MethodBase method;
private int offset;
private int ILOffset;
private String strFileName;
private int iLineNumber;
private int iColumnNumber;
internal void InitMembers()
{
method = null;
offset = OFFSET_UNKNOWN;
ILOffset = OFFSET_UNKNOWN;
strFileName = null;
iLineNumber = 0;
iColumnNumber = 0;
}
// Constructs a StackFrame corresponding to the active stack frame.
public StackFrame()
{
InitMembers();
BuildStackFrame (0 + StackTrace.METHODS_TO_SKIP, false);// iSkipFrames=0
}
// Constructs a StackFrame corresponding to the active stack frame.
public StackFrame(bool fNeedFileInfo)
{
InitMembers();
BuildStackFrame (0 + StackTrace.METHODS_TO_SKIP, fNeedFileInfo);// iSkipFrames=0
}
// Constructs a StackFrame corresponding to a calling stack frame.
//
public StackFrame(int skipFrames)
{
InitMembers();
BuildStackFrame (skipFrames + StackTrace.METHODS_TO_SKIP, false);
}
// Constructs a StackFrame corresponding to a calling stack frame.
//
public StackFrame(int skipFrames, bool fNeedFileInfo)
{
InitMembers();
BuildStackFrame (skipFrames + StackTrace.METHODS_TO_SKIP, fNeedFileInfo);
}
// Called from the class "StackTrace"
//
internal StackFrame(bool DummyFlag1, bool DummyFlag2)
{
InitMembers();
}
// Constructs a "fake" stack frame, just containing the given file
// name and line number. Use when you don't want to use the
// debugger's line mapping logic.
//
public StackFrame(String fileName, int lineNumber)
{
InitMembers();
BuildStackFrame (StackTrace.METHODS_TO_SKIP, false);
strFileName = fileName;
iLineNumber = lineNumber;
iColumnNumber = 0;
}
// Constructs a "fake" stack frame, just containing the given file
// name, line number and column number. Use when you don't want to
// use the debugger's line mapping logic.
//
public StackFrame(String fileName, int lineNumber, int colNumber)
{
InitMembers();
BuildStackFrame (StackTrace.METHODS_TO_SKIP, false);
strFileName = fileName;
iLineNumber = lineNumber;
iColumnNumber = colNumber;
}
// Constant returned when the native or IL offset is unknown
public const int OFFSET_UNKNOWN = -1;
internal virtual void SetMethodBase (MethodBase mb)
{
method = mb;
}
internal virtual void SetOffset (int iOffset)
{
offset = iOffset;
}
internal virtual void SetILOffset (int iOffset)
{
ILOffset = iOffset;
}
internal virtual void SetFileName (String strFName)
{
strFileName = strFName;
}
internal virtual void SetLineNumber (int iLine)
{
iLineNumber = iLine;
}
internal virtual void SetColumnNumber (int iCol)
{
iColumnNumber = iCol;
}
// Returns the method the frame is executing
//
public virtual MethodBase GetMethod ()
{
return method;
}
// Returns the offset from the start of the native (jitted) code for the
// method being executed
//
public virtual int GetNativeOffset ()
{
return offset;
}
// Returns the offset from the start of the IL code for the
// method being executed. This offset may be approximate depending
// on whether the jitter is generating debuggable code or not.
//
public virtual int GetILOffset()
{
return ILOffset;
}
// Returns the file name containing the code being executed. This
// information is normally extracted from the debugging symbols
// for the executable.
//
public virtual String GetFileName()
{
if (strFileName != null)
{
// This isn't really correct, but we don't have
// a permission that protects discovery of potentially
// local urls so we'll use this.
FileIOPermission perm = new FileIOPermission( PermissionState.None );
perm.AllFiles = FileIOPermissionAccess.PathDiscovery;
perm.Demand();
}
return strFileName;
}
// Returns the line number in the file containing the code being executed.
// This information is normally extracted from the debugging symbols
// for the executable.
//
public virtual int GetFileLineNumber()
{
return iLineNumber;
}
// Returns the column number in the line containing the code being executed.
// This information is normally extracted from the debugging symbols
// for the executable.
//
public virtual int GetFileColumnNumber()
{
return iColumnNumber;
}
// Builds a readable representation of the stack frame
//
public override String ToString()
{
StringBuilder sb = new StringBuilder(255);
if (method != null)
{
sb.Append(method.Name);
// deal with the generic portion of the method
if (method is MethodInfo && ((MethodInfo)method).IsGenericMethod)
{
Type[] typars = ((MethodInfo)method).GetGenericArguments();
sb.Append ("<");
int k=0;
bool fFirstTyParam = true;
while (k < typars.Length)
{
if (fFirstTyParam == false)
sb.Append (",");
else
fFirstTyParam = false;
sb.Append (typars[k].Name);
k++;
}
sb.Append (">");
}
sb.Append(" at offset ");
if (offset == OFFSET_UNKNOWN)
sb.Append("");
else
sb.Append(offset);
sb.Append(" in file:line:column ");
bool useFileName = (strFileName != null);
if (useFileName)
{
try
{
// This isn't really correct, but we don't have
// a permission that protects discovery of potentially
// local urls so we'll use this.
FileIOPermission perm = new FileIOPermission( PermissionState.None );
perm.AllFiles = FileIOPermissionAccess.PathDiscovery;
perm.Demand();
}
catch (System.Security.SecurityException)
{
useFileName = false;
}
}
if (!useFileName)
sb.Append("");
else
sb.Append(strFileName);
sb.Append(":");
sb.Append(iLineNumber);
sb.Append(":");
sb.Append(iColumnNumber);
}
else
{
sb.Append("");
}
sb.Append(Environment.NewLine);
return sb.ToString();
}
private void BuildStackFrame(int skipFrames, bool fNeedFileInfo)
{
StackFrameHelper StackF = new StackFrameHelper(fNeedFileInfo, null);
StackTrace.GetStackFramesInternal (StackF, 0, null);
int iNumOfFrames = StackF.GetNumberOfFrames();
skipFrames += StackTrace.CalculateFramesToSkip (StackF, iNumOfFrames);
if ((iNumOfFrames - skipFrames) > 0)
{
method = StackF.GetMethodBase (skipFrames);
offset = StackF.GetOffset (skipFrames);
ILOffset = StackF.GetILOffset (skipFrames);
if (fNeedFileInfo)
{
strFileName = StackF.GetFilename (skipFrames);
iLineNumber = StackF.GetLineNumber (skipFrames);
iColumnNumber = StackF.GetColumnNumber (skipFrames);
}
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
namespace System.Diagnostics {
using System.Text;
using System;
using System.IO;
using System.Reflection;
using System.Security.Permissions;
// There is no good reason for the methods of this class to be virtual.
// In order to ensure trusted code can trust the data it gets from a
// StackTrace, we use an InheritanceDemand to prevent partially-trusted
// subclasses.
[SecurityPermission(SecurityAction.InheritanceDemand, UnmanagedCode=true)]
[Serializable()]
[System.Runtime.InteropServices.ComVisible(true)]
public class StackFrame
{
private MethodBase method;
private int offset;
private int ILOffset;
private String strFileName;
private int iLineNumber;
private int iColumnNumber;
internal void InitMembers()
{
method = null;
offset = OFFSET_UNKNOWN;
ILOffset = OFFSET_UNKNOWN;
strFileName = null;
iLineNumber = 0;
iColumnNumber = 0;
}
// Constructs a StackFrame corresponding to the active stack frame.
public StackFrame()
{
InitMembers();
BuildStackFrame (0 + StackTrace.METHODS_TO_SKIP, false);// iSkipFrames=0
}
// Constructs a StackFrame corresponding to the active stack frame.
public StackFrame(bool fNeedFileInfo)
{
InitMembers();
BuildStackFrame (0 + StackTrace.METHODS_TO_SKIP, fNeedFileInfo);// iSkipFrames=0
}
// Constructs a StackFrame corresponding to a calling stack frame.
//
public StackFrame(int skipFrames)
{
InitMembers();
BuildStackFrame (skipFrames + StackTrace.METHODS_TO_SKIP, false);
}
// Constructs a StackFrame corresponding to a calling stack frame.
//
public StackFrame(int skipFrames, bool fNeedFileInfo)
{
InitMembers();
BuildStackFrame (skipFrames + StackTrace.METHODS_TO_SKIP, fNeedFileInfo);
}
// Called from the class "StackTrace"
//
internal StackFrame(bool DummyFlag1, bool DummyFlag2)
{
InitMembers();
}
// Constructs a "fake" stack frame, just containing the given file
// name and line number. Use when you don't want to use the
// debugger's line mapping logic.
//
public StackFrame(String fileName, int lineNumber)
{
InitMembers();
BuildStackFrame (StackTrace.METHODS_TO_SKIP, false);
strFileName = fileName;
iLineNumber = lineNumber;
iColumnNumber = 0;
}
// Constructs a "fake" stack frame, just containing the given file
// name, line number and column number. Use when you don't want to
// use the debugger's line mapping logic.
//
public StackFrame(String fileName, int lineNumber, int colNumber)
{
InitMembers();
BuildStackFrame (StackTrace.METHODS_TO_SKIP, false);
strFileName = fileName;
iLineNumber = lineNumber;
iColumnNumber = colNumber;
}
// Constant returned when the native or IL offset is unknown
public const int OFFSET_UNKNOWN = -1;
internal virtual void SetMethodBase (MethodBase mb)
{
method = mb;
}
internal virtual void SetOffset (int iOffset)
{
offset = iOffset;
}
internal virtual void SetILOffset (int iOffset)
{
ILOffset = iOffset;
}
internal virtual void SetFileName (String strFName)
{
strFileName = strFName;
}
internal virtual void SetLineNumber (int iLine)
{
iLineNumber = iLine;
}
internal virtual void SetColumnNumber (int iCol)
{
iColumnNumber = iCol;
}
// Returns the method the frame is executing
//
public virtual MethodBase GetMethod ()
{
return method;
}
// Returns the offset from the start of the native (jitted) code for the
// method being executed
//
public virtual int GetNativeOffset ()
{
return offset;
}
// Returns the offset from the start of the IL code for the
// method being executed. This offset may be approximate depending
// on whether the jitter is generating debuggable code or not.
//
public virtual int GetILOffset()
{
return ILOffset;
}
// Returns the file name containing the code being executed. This
// information is normally extracted from the debugging symbols
// for the executable.
//
public virtual String GetFileName()
{
if (strFileName != null)
{
// This isn't really correct, but we don't have
// a permission that protects discovery of potentially
// local urls so we'll use this.
FileIOPermission perm = new FileIOPermission( PermissionState.None );
perm.AllFiles = FileIOPermissionAccess.PathDiscovery;
perm.Demand();
}
return strFileName;
}
// Returns the line number in the file containing the code being executed.
// This information is normally extracted from the debugging symbols
// for the executable.
//
public virtual int GetFileLineNumber()
{
return iLineNumber;
}
// Returns the column number in the line containing the code being executed.
// This information is normally extracted from the debugging symbols
// for the executable.
//
public virtual int GetFileColumnNumber()
{
return iColumnNumber;
}
// Builds a readable representation of the stack frame
//
public override String ToString()
{
StringBuilder sb = new StringBuilder(255);
if (method != null)
{
sb.Append(method.Name);
// deal with the generic portion of the method
if (method is MethodInfo && ((MethodInfo)method).IsGenericMethod)
{
Type[] typars = ((MethodInfo)method).GetGenericArguments();
sb.Append ("<");
int k=0;
bool fFirstTyParam = true;
while (k < typars.Length)
{
if (fFirstTyParam == false)
sb.Append (",");
else
fFirstTyParam = false;
sb.Append (typars[k].Name);
k++;
}
sb.Append (">");
}
sb.Append(" at offset ");
if (offset == OFFSET_UNKNOWN)
sb.Append("");
else
sb.Append(offset);
sb.Append(" in file:line:column ");
bool useFileName = (strFileName != null);
if (useFileName)
{
try
{
// This isn't really correct, but we don't have
// a permission that protects discovery of potentially
// local urls so we'll use this.
FileIOPermission perm = new FileIOPermission( PermissionState.None );
perm.AllFiles = FileIOPermissionAccess.PathDiscovery;
perm.Demand();
}
catch (System.Security.SecurityException)
{
useFileName = false;
}
}
if (!useFileName)
sb.Append("");
else
sb.Append(strFileName);
sb.Append(":");
sb.Append(iLineNumber);
sb.Append(":");
sb.Append(iColumnNumber);
}
else
{
sb.Append("");
}
sb.Append(Environment.NewLine);
return sb.ToString();
}
private void BuildStackFrame(int skipFrames, bool fNeedFileInfo)
{
StackFrameHelper StackF = new StackFrameHelper(fNeedFileInfo, null);
StackTrace.GetStackFramesInternal (StackF, 0, null);
int iNumOfFrames = StackF.GetNumberOfFrames();
skipFrames += StackTrace.CalculateFramesToSkip (StackF, iNumOfFrames);
if ((iNumOfFrames - skipFrames) > 0)
{
method = StackF.GetMethodBase (skipFrames);
offset = StackF.GetOffset (skipFrames);
ILOffset = StackF.GetILOffset (skipFrames);
if (fNeedFileInfo)
{
strFileName = StackF.GetFilename (skipFrames);
iLineNumber = StackF.GetLineNumber (skipFrames);
iColumnNumber = StackF.GetColumnNumber (skipFrames);
}
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XmlSchemaInfo.cs
- UidManager.cs
- OleDbConnectionFactory.cs
- CaseInsensitiveOrdinalStringComparer.cs
- ImmutableObjectAttribute.cs
- ServicesUtilities.cs
- GeneralTransform3DGroup.cs
- sqlcontext.cs
- FontFaceLayoutInfo.cs
- MemberInfoSerializationHolder.cs
- TrailingSpaceComparer.cs
- Variant.cs
- ToolstripProfessionalRenderer.cs
- UIElement3DAutomationPeer.cs
- XpsFilter.cs
- DataObject.cs
- ResourcePool.cs
- safemediahandle.cs
- MimeAnyImporter.cs
- CultureInfo.cs
- UriExt.cs
- GenericWebPart.cs
- EntityContainerEmitter.cs
- XmlBinaryReader.cs
- TiffBitmapEncoder.cs
- DrawItemEvent.cs
- AnimationClock.cs
- MessageEncoderFactory.cs
- _OverlappedAsyncResult.cs
- OleDbTransaction.cs
- PerformanceCounterManager.cs
- WorkflowApplicationAbortedException.cs
- Int16.cs
- Property.cs
- DeviceContext.cs
- FontWeight.cs
- EndpointAddressElementBase.cs
- InlineCollection.cs
- ManualWorkflowSchedulerService.cs
- LayoutEditorPart.cs
- LinkTarget.cs
- LocatorBase.cs
- XPathBuilder.cs
- FtpRequestCacheValidator.cs
- WebPartTransformer.cs
- SmtpLoginAuthenticationModule.cs
- StrongNamePublicKeyBlob.cs
- XmlSequenceWriter.cs
- SerializationSectionGroup.cs
- HttpChannelBindingToken.cs
- QilTypeChecker.cs
- TTSEvent.cs
- StructuralObject.cs
- MailHeaderInfo.cs
- ScriptRegistrationManager.cs
- DynamicDataManager.cs
- ButtonStandardAdapter.cs
- LogLogRecordHeader.cs
- PropertyTabChangedEvent.cs
- InputManager.cs
- Typeface.cs
- ErasingStroke.cs
- TextRangeAdaptor.cs
- SerializationAttributes.cs
- ZipIOCentralDirectoryBlock.cs
- EdmRelationshipNavigationPropertyAttribute.cs
- IERequestCache.cs
- mediapermission.cs
- log.cs
- WrappedOptions.cs
- ConfigurationFileMap.cs
- MappingMetadataHelper.cs
- ListControl.cs
- SettingsAttributes.cs
- Addressing.cs
- ObjectDataProvider.cs
- ActivityDesigner.cs
- MimeMapping.cs
- ServiceHostingEnvironment.cs
- SerializationFieldInfo.cs
- MatrixTransform3D.cs
- BlockUIContainer.cs
- LinkDescriptor.cs
- KeyedHashAlgorithm.cs
- HelpEvent.cs
- InternalBufferOverflowException.cs
- _HeaderInfo.cs
- QuestionEventArgs.cs
- Expressions.cs
- Menu.cs
- HierarchicalDataTemplate.cs
- X509Certificate2.cs
- IsolatedStorageFile.cs
- CollectionChangeEventArgs.cs
- SortExpressionBuilder.cs
- ActivityWithResultConverter.cs
- SHA256Managed.cs
- Line.cs
- Expression.cs
- DynamicVirtualDiscoSearcher.cs