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
- DictionaryItemsCollection.cs
- Figure.cs
- LineServicesCallbacks.cs
- TlsnegoTokenProvider.cs
- IssuedTokenClientCredential.cs
- OperationCanceledException.cs
- SafeProcessHandle.cs
- GifBitmapEncoder.cs
- WindowsHyperlink.cs
- ToolStripComboBox.cs
- CacheEntry.cs
- CodeDirectionExpression.cs
- HwndProxyElementProvider.cs
- ComponentResourceKey.cs
- TraceInternal.cs
- RSAPKCS1KeyExchangeDeformatter.cs
- XmlWriterSettings.cs
- RowVisual.cs
- TabItemWrapperAutomationPeer.cs
- WebServiceErrorEvent.cs
- LoginDesigner.cs
- invalidudtexception.cs
- CodeAttachEventStatement.cs
- ZipIOCentralDirectoryBlock.cs
- BamlTreeUpdater.cs
- XmlChildEnumerator.cs
- TableCell.cs
- RootBrowserWindowAutomationPeer.cs
- IdentityNotMappedException.cs
- ExtendedTransformFactory.cs
- RightsManagementEncryptedStream.cs
- DEREncoding.cs
- ProcessHost.cs
- GridViewHeaderRowPresenter.cs
- ContextStaticAttribute.cs
- FixedDSBuilder.cs
- HttpDebugHandler.cs
- TextModifier.cs
- Typography.cs
- Thickness.cs
- SqlColumnizer.cs
- ParagraphResult.cs
- SafeNativeMethods.cs
- xmlsaver.cs
- StaticSiteMapProvider.cs
- DesignerTransactionCloseEvent.cs
- DrawingGroupDrawingContext.cs
- TransformDescriptor.cs
- XmlCodeExporter.cs
- Latin1Encoding.cs
- UriScheme.cs
- AuthorizationBehavior.cs
- CompoundFileIOPermission.cs
- PathFigureCollectionValueSerializer.cs
- EntityRecordInfo.cs
- Brush.cs
- TreeNode.cs
- ExceptionTranslationTable.cs
- GridViewItemAutomationPeer.cs
- Privilege.cs
- ArrayEditor.cs
- ObjectConverter.cs
- TypedRowHandler.cs
- ParseHttpDate.cs
- HttpAsyncResult.cs
- DateTimeSerializationSection.cs
- XPathNodePointer.cs
- DataServiceRequest.cs
- DictionaryContent.cs
- ColorBlend.cs
- LocationUpdates.cs
- Matrix.cs
- EditBehavior.cs
- KoreanLunisolarCalendar.cs
- EntityProviderFactory.cs
- LinkedDataMemberFieldEditor.cs
- StrongNameKeyPair.cs
- TextRangeBase.cs
- MessagePropertyVariants.cs
- FileVersionInfo.cs
- UserControl.cs
- UpdateExpressionVisitor.cs
- ApplicationFileCodeDomTreeGenerator.cs
- MenuTracker.cs
- Resources.Designer.cs
- TemplateAction.cs
- PagesSection.cs
- ProfileService.cs
- SurrogateDataContract.cs
- GridViewDeleteEventArgs.cs
- CompiledQuery.cs
- BeginEvent.cs
- PingReply.cs
- ProcessInfo.cs
- PenThreadWorker.cs
- ConfigurationManagerHelperFactory.cs
- DataTableReaderListener.cs
- Msec.cs
- AccessibleObject.cs
- LambdaCompiler.cs