Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / RunTime / DebugEngine / ProgramPublisher.cs / 1305376 / ProgramPublisher.cs
// Copyright (c) Microsoft Corp., 2004. All rights reserved. #region Using directives using System; using System.Threading; using System.Reflection; using System.Runtime.InteropServices; using System.Diagnostics; #endregion namespace System.Workflow.Runtime.DebugEngine { [ComImport, Guid(Guids.CLSID_WDEProgramPublisher)] internal class WDEProgramPublisher { } internal sealed class ProgramPublisher { #region Data members private bool isPublished = false; IWDEProgramPublisher publisher; private DebugController controller; GCHandle gchWdeProgramNode; // This is used to pin the wdeProgramNodeSingleton (VS Debugger is using address to calculate cookies) private IWDEProgramNode wdeProgramNodeSingleton; #endregion #region Methods public ProgramPublisher() { this.publisher = null; } public bool Publish(DebugController controller) { Debug.WriteLine("WDE: ProgramPublisher.Publish()"); // In order to guarantee that the Program Nodes are always in the MTA, publish on a separate thread. if (isPublished) return false; try { this.controller = controller; Thread publisherThread = new Thread(PublisherThreadFunc); publisherThread.SetApartmentState(ApartmentState.MTA); publisherThread.IsBackground = true; publisherThread.Start(); publisherThread.Join(); } catch(Exception e) { // Eat up exceptions if the debugger is not installed. Debug.WriteLine("WDE: ProgramPublisher.Publish() exception: " + e.ToString()); } return this.isPublished; } private void PublisherThreadFunc() { try { this.publisher = new WDEProgramPublisher() as IWDEProgramPublisher; this.wdeProgramNodeSingleton = new ProgramNode(this.controller); this.gchWdeProgramNode = GCHandle.Alloc(this.wdeProgramNodeSingleton); this.publisher.Publish(this.wdeProgramNodeSingleton); this.isPublished = true; } catch(Exception e) { // Ignore any exceptions that are caused by WDE.dll not being present or registered. Debug.WriteLine("WDE: ProgramPublisher.PublisherThreadFunc() exception: " + e.ToString()); } } public void Unpublish() { if (!isPublished) return; Debug.WriteLine("WDE: ProgramPublisher.Unpublish()"); // In order to guarantee that the Program Nodes are always in the MTA, unpublish on a separate thread. try { Thread unpublisherThread = new Thread(UnpublishThreadFunc); unpublisherThread.SetApartmentState(ApartmentState.MTA); unpublisherThread.IsBackground = true; unpublisherThread.Start(); unpublisherThread.Join(); } catch (Exception e) { // Eat up exceptions if the debugger is not installed, etc. Debug.WriteLine("WDE: ProgramPublisher.Unpublish() exception: " + e.ToString()); } Debug.WriteLine("WDE: ProgramPublisher.Unpublish() Done"); } private void UnpublishThreadFunc() { try { this.publisher.Unpublish(this.wdeProgramNodeSingleton); } catch (Exception e) { Debug.WriteLine("WDE: ProgramPublisher.UnpublishThreadFunc(): catch exception " + e.ToString()); // We eat up any exceptions that can occur because the host process is abnormally terminated. } finally { this.gchWdeProgramNode.Free();// Rrelease pin on the this.wdeProgramNodeSingleton Marshal.ReleaseComObject(this.publisher); this.publisher = null; } this.isPublished = false; } #endregion } [ComImport(), Guid(Guids.IID_IWDEProgramPublisher), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IWDEProgramPublisher { void Publish([MarshalAs(UnmanagedType.IUnknown)] object ProgramNode); void Unpublish([MarshalAs(UnmanagedType.IUnknown)] object ProgramNode); } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ThreadAbortException.cs
- XmlComplianceUtil.cs
- XmlWrappingReader.cs
- TreeViewEvent.cs
- SubstitutionList.cs
- PatternMatcher.cs
- Typeface.cs
- counter.cs
- TextCharacters.cs
- ControlUtil.cs
- BamlResourceDeserializer.cs
- HashCryptoHandle.cs
- WindowVisualStateTracker.cs
- SafeRegistryHandle.cs
- CounterCreationDataCollection.cs
- TagMapInfo.cs
- Cursor.cs
- DataGridDesigner.cs
- Descriptor.cs
- InitiatorSessionSymmetricMessageSecurityProtocol.cs
- SystemResourceKey.cs
- HttpConfigurationContext.cs
- MULTI_QI.cs
- SplitContainerDesigner.cs
- CollectionType.cs
- DataSourceCache.cs
- BindingExpression.cs
- FlowDocumentPageViewerAutomationPeer.cs
- CodeArgumentReferenceExpression.cs
- TrueReadOnlyCollection.cs
- ObjectFullSpanRewriter.cs
- RegionInfo.cs
- ClientTargetCollection.cs
- MemberPath.cs
- CodePropertyReferenceExpression.cs
- XmlSchemaCompilationSettings.cs
- Int32.cs
- SplitterPanel.cs
- SpecialNameAttribute.cs
- ToolboxItemAttribute.cs
- CategoryAttribute.cs
- DirectionalLight.cs
- TypeDependencyAttribute.cs
- ParserHooks.cs
- XmlNodeComparer.cs
- SecurityTokenRequirement.cs
- ScrollBarAutomationPeer.cs
- TemplateEditingVerb.cs
- CodePrimitiveExpression.cs
- ArrayWithOffset.cs
- DocumentApplicationJournalEntry.cs
- ParamArrayAttribute.cs
- Button.cs
- TextBox.cs
- StrokeNodeEnumerator.cs
- TimeSpanMinutesConverter.cs
- RectangleHotSpot.cs
- MetadataSerializer.cs
- PropertyPanel.cs
- EmptyControlCollection.cs
- MSHTMLHost.cs
- RegexCaptureCollection.cs
- Icon.cs
- GraphicsContext.cs
- XhtmlBasicTextBoxAdapter.cs
- RTLAwareMessageBox.cs
- FixedPosition.cs
- SHA512.cs
- XmlSchemaException.cs
- Control.cs
- MetaModel.cs
- sortedlist.cs
- ICspAsymmetricAlgorithm.cs
- ProtectedConfigurationSection.cs
- AutoGeneratedField.cs
- DrawingContextDrawingContextWalker.cs
- DBParameter.cs
- FlowDocumentPageViewerAutomationPeer.cs
- GeneratedView.cs
- OnOperation.cs
- KnownIds.cs
- OleDbDataReader.cs
- DynamicValueConverter.cs
- LogExtent.cs
- IncrementalCompileAnalyzer.cs
- StringFunctions.cs
- EventArgs.cs
- MenuItemStyleCollection.cs
- WebPartZone.cs
- Configuration.cs
- QilValidationVisitor.cs
- SqlClientMetaDataCollectionNames.cs
- ExplicitDiscriminatorMap.cs
- SafeUserTokenHandle.cs
- FullTrustAssembly.cs
- EntityDesignerUtils.cs
- X509Certificate2Collection.cs
- GuidTagList.cs
- ActivityAction.cs
- DataGridLengthConverter.cs