Code:
/ 4.0 / 4.0 / 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. // ==++== // // 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
- WebContext.cs
- ObjectItemCachedAssemblyLoader.cs
- QilLiteral.cs
- DoubleLinkListEnumerator.cs
- DataSourceDesigner.cs
- ItemsChangedEventArgs.cs
- StringOutput.cs
- CroppedBitmap.cs
- PersonalizationProvider.cs
- XsltFunctions.cs
- XmlChoiceIdentifierAttribute.cs
- BamlLocalizabilityResolver.cs
- GPPOINTF.cs
- ConfigUtil.cs
- SmiEventSink_DeferedProcessing.cs
- CommandLineParser.cs
- NumericUpDownAccelerationCollection.cs
- HttpStaticObjectsCollectionBase.cs
- ResourceBinder.cs
- X509CertificateCollection.cs
- SqlDataSourceRefreshSchemaForm.cs
- PlanCompilerUtil.cs
- DataControlPagerLinkButton.cs
- ContentDisposition.cs
- ProtectedConfigurationSection.cs
- SplitContainerDesigner.cs
- Icon.cs
- UiaCoreTypesApi.cs
- DataContractSerializerServiceBehavior.cs
- GenericIdentity.cs
- SqlDataSourceEnumerator.cs
- WinCategoryAttribute.cs
- IMembershipProvider.cs
- WebAdminConfigurationHelper.cs
- MenuTracker.cs
- QilXmlReader.cs
- DataGridViewCellValueEventArgs.cs
- ServiceNameElementCollection.cs
- MD5CryptoServiceProvider.cs
- QueryableDataSourceEditData.cs
- PropertyValue.cs
- NonParentingControl.cs
- ProfessionalColorTable.cs
- Util.cs
- EntityDataSourceContainerNameItem.cs
- BrowserDefinition.cs
- ListControlBoundActionList.cs
- grammarelement.cs
- IdentityNotMappedException.cs
- ActivityExecutorOperation.cs
- FontInfo.cs
- SecurityKeyEntropyMode.cs
- ProxyWebPartConnectionCollection.cs
- GridProviderWrapper.cs
- TextRangeProviderWrapper.cs
- SystemUdpStatistics.cs
- userdatakeys.cs
- RightsManagementEncryptedStream.cs
- Panel.cs
- DoubleLinkListEnumerator.cs
- Image.cs
- WizardStepBase.cs
- AttributeEmitter.cs
- LinkedResourceCollection.cs
- Sentence.cs
- UIElementCollection.cs
- CodeActivity.cs
- KeyValueConfigurationCollection.cs
- RootContext.cs
- EditorZone.cs
- HttpResponse.cs
- ColorDialog.cs
- WebServiceEnumData.cs
- HttpContext.cs
- If.cs
- DefaultPrintController.cs
- FlowLayoutPanel.cs
- CopyNodeSetAction.cs
- CapabilitiesState.cs
- DataMisalignedException.cs
- BooleanToVisibilityConverter.cs
- CommandLibraryHelper.cs
- HttpCookie.cs
- TabRenderer.cs
- codemethodreferenceexpression.cs
- OrCondition.cs
- HttpHandlerActionCollection.cs
- FontSource.cs
- XmlnsDefinitionAttribute.cs
- DirtyTextRange.cs
- BoolExpr.cs
- EmissiveMaterial.cs
- AttributeUsageAttribute.cs
- XmlAnyElementAttributes.cs
- HwndMouseInputProvider.cs
- TrackingServices.cs
- BrowserDefinitionCollection.cs
- Visual.cs
- ProcessHostMapPath.cs
- SoapCodeExporter.cs