Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / AddIn / AddIn / System / Addin / Hosting / AddInServer.cs / 1305376 / AddInServer.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: AddInServer ** ** Purpose: Created in the remote process, this worker is ** used to start up & shut down the add-in. ** ===========================================================*/ using System; using System.AddIn; using System.AddIn.Contract; using System.AddIn.Hosting; using System.AddIn.Pipeline; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Reflection; using System.Runtime.Remoting; using System.Security; using System.Security.Permissions; using System.Threading; using System.Diagnostics.Contracts; namespace System.AddIn.Hosting { [SuppressMessage("Microsoft.Performance","CA1812:AvoidUninstantiatedInternalClasses", Justification="Instantiation is via remoting")] internal sealed class AddInServer : MarshalByRefObject { private int _addInAppDomains = 0; private volatile bool _startedExitProcess = false; // This serves as a MBRO that can send the ShuttingDown event back to the client private EventWorker _eventWorker; public void Initialize(EventWorker eventWorker) { _eventWorker = eventWorker; } //// [System.Security.SecuritySafeCritical] public AddInServerWorker CreateDomain(AddInToken token, PermissionSet permissionSet) { AppDomain domain; AppDomainSetup setup = new AppDomainSetup(); setup.ApplicationBase = Path.GetDirectoryName(token._addin.Location); setup.ConfigurationFile = token._addin.Location + ".config"; Assembly sysCore = typeof(AddInActivator).Assembly; domain = AppDomain.CreateDomain(token.Name, AppDomain.CurrentDomain.Evidence, setup, permissionSet, AddInActivator.CreateStrongName(sysCore)); // Grant full trust to System.Core.dll // Ensure we load System.Core.dll in this new AD. domain.Load(sysCore.FullName); ObjectHandle workerHandle = Activator.CreateInstance(domain, sysCore.FullName, typeof(AddInServerWorker).FullName); AddInServerWorker server = (AddInServerWorker)workerHandle.Unwrap(); server.AddInServer = this; Interlocked.Increment(ref _addInAppDomains); return server; } public void ExitProcess() { // set flag so that we don't call back to host from finalizers _startedExitProcess = true; // This is called in the full-trust appdomain, so no assert is needed. Environment.Exit(0); } public void AddInDomainFinalized() { long val = Interlocked.Decrement(ref _addInAppDomains); if (!_startedExitProcess && val == 0) { try { // the host will call ExitProcess here if it is not cancelled _eventWorker.SendShutdownMessage(); } catch (RemotingException) { // the application likely has shut down itself. // The main thread will shut down this app } } } // Don't let this object time out in Remoting. public override Object InitializeLifetimeService() { return null; } } [SuppressMessage("Microsoft.Performance","CA1812:AvoidUninstantiatedInternalClasses", Justification="Instantiation is via remoting")] [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2128:SecurityTransparentCodeShouldNotAssert", Justification = "This is a SecurityRules.Level1 assembly, in which this rule is being incorrectly applied")] internal sealed class AddInServerWorker : MarshalByRefObject { AddInServer _addInServer; [SuppressMessage("Microsoft.Security","CA2128:SecurityTransparentCodeShouldNotAssert", Justification="SafeCritical code can Assert")] [System.Security.SecuritySafeCritical] public AddInServerWorker() { PermissionSet permissionSet = new PermissionSet(PermissionState.None); permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.ControlPrincipal)); permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode)); permissionSet.AddPermission(new ReflectionPermission(PermissionState.Unrestricted)); permissionSet.Assert(); // without this call to initialize the client channel, this object cannot be remoted RemotingHelper.InitializeClientChannel(); } //// // // [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification="Needs to be instance for remoting"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands", Justification = "Reviewed")] [System.Security.SecuritySafeCritical] [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2128:SecurityTransparentCodeShouldNotAssert", Justification = "This is a SecurityRules.Level1 assembly, in which this rule is being incorrectly applied")] public void SetAppDomainOwner(IContract contract) { new SecurityPermission(SecurityPermissionFlag.ControlAppDomain).Assert(); AppDomain.CurrentDomain.SetData(ContractHandle.s_appDomainOwner, contract); } public AddInServer AddInServer { set { _addInServer = value; } } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification="Needs to be instance for remoting")] public IContract Activate(AddInToken pipeline, out ActivationWorker worker) { worker = new ActivationWorker(pipeline); IContract contract = worker.Activate(); return contract; } // Don't let this object time out in Remoting. public override Object InitializeLifetimeService() { return null; } //// // // [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification="Needs to be instance for remoting")] [System.Security.SecurityCritical] public void UnloadAppDomain() { SecurityPermission permission = new SecurityPermission(SecurityPermissionFlag.ControlAppDomain); permission.Assert(); AppDomain.Unload(AppDomain.CurrentDomain); // thread will be aborted } //This appdomain must be going away //// // [System.Security.SecurityCritical] ~AddInServerWorker() { if (_addInServer != null) { _addInServer.AddInDomainFinalized(); } } } internal sealed class EventWorker : MarshalByRefObject { AddInProcess _process; public EventWorker(AddInProcess process) { _process = process; } public bool SendShutdownMessage() { CancelEventArgs args = new CancelEventArgs(); _process.SendShuttingDown(args); return args.Cancel; } } } // 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
- SoapIncludeAttribute.cs
- XmlValidatingReader.cs
- TypeTypeConverter.cs
- PointAnimation.cs
- SamlAdvice.cs
- XmlMessageFormatter.cs
- File.cs
- CoTaskMemHandle.cs
- ScriptMethodAttribute.cs
- IEnumerable.cs
- RtfControlWordInfo.cs
- UrlAuthorizationModule.cs
- EngineSite.cs
- XmlName.cs
- CDSCollectionETWBCLProvider.cs
- DataPager.cs
- CharEnumerator.cs
- RegexRunner.cs
- FormattedTextSymbols.cs
- PropertiesTab.cs
- GuidConverter.cs
- WebResourceAttribute.cs
- PingReply.cs
- InvalidDataException.cs
- ChannelEndpointElementCollection.cs
- BaseCodeDomTreeGenerator.cs
- BinaryFormatterWriter.cs
- LicFileLicenseProvider.cs
- ColumnResizeUndoUnit.cs
- Attributes.cs
- ListViewItem.cs
- InternalBase.cs
- MessageQueue.cs
- SafeRightsManagementEnvironmentHandle.cs
- HttpModuleAction.cs
- SystemBrushes.cs
- ColumnResizeUndoUnit.cs
- MetadataSerializer.cs
- EnumDataContract.cs
- StateManagedCollection.cs
- DatatypeImplementation.cs
- CollectionViewProxy.cs
- TrackPointCollection.cs
- EventLogPermissionEntry.cs
- StandardBindingReliableSessionElement.cs
- PathSegmentCollection.cs
- WebContext.cs
- SiteMapDataSourceView.cs
- GridViewAutomationPeer.cs
- ImpersonateTokenRef.cs
- ComUdtElement.cs
- MouseBinding.cs
- SQLByteStorage.cs
- _ListenerRequestStream.cs
- DrawListViewColumnHeaderEventArgs.cs
- EncryptedType.cs
- ControlPropertyNameConverter.cs
- ZipPackagePart.cs
- DetailsViewRowCollection.cs
- DesignTimeResourceProviderFactoryAttribute.cs
- OleDbError.cs
- XmlSchemas.cs
- Literal.cs
- BitmapFrameEncode.cs
- SpoolingTaskBase.cs
- SqlDependencyUtils.cs
- SubMenuStyleCollection.cs
- FtpCachePolicyElement.cs
- ResXBuildProvider.cs
- FormattedTextSymbols.cs
- EntityClientCacheEntry.cs
- Transform3DGroup.cs
- Operators.cs
- NavigationPropertyEmitter.cs
- RSAOAEPKeyExchangeFormatter.cs
- ConnectionConsumerAttribute.cs
- BamlLocalizer.cs
- HttpCapabilitiesEvaluator.cs
- BatchStream.cs
- BitmapEffectDrawingContent.cs
- TextServicesCompartmentEventSink.cs
- ReflectionUtil.cs
- InputScope.cs
- PropertyGeneratedEventArgs.cs
- ProfileManager.cs
- SqlDataSourceView.cs
- PinProtectionHelper.cs
- EmptyStringExpandableObjectConverter.cs
- PlaceHolder.cs
- FacetEnabledSchemaElement.cs
- ControlValuePropertyAttribute.cs
- InArgumentConverter.cs
- TextCharacters.cs
- SiteMapProvider.cs
- PenThread.cs
- ImageUrlEditor.cs
- UrlAuthorizationModule.cs
- Pen.cs
- Int16Converter.cs
- RelatedPropertyManager.cs