// // Copyright (c) 2009 Microsoft Corporation. All rights reserved. // // DISCLAIMER OF WARRANTY: The software is licensed “as-is.” You // bear the risk of using it. Microsoft gives no express warranties, // guarantees or conditions. You may have additional consumer rights // under your local laws which this agreement cannot change. To the extent // permitted under your local laws, Microsoft excludes the implied warranties // of merchantability, fitness for a particular purpose and non-infringement. namespace Microsoft.Samples.PowerShell.Host { using System; using System.Globalization; using System.Management.Automation.Host; using System.Management.Automation.Runspaces; /// /// A sample implementation of the PSHost abstract class for console /// applications. Not all members are implemented. Those that are not /// implemented throw a NotImplementedException exception. /// internal class MyHost : PSHost, IHostSupportsInteractiveSession { public MyHost(PSListenerConsoleSample program) { this.program = program; } /// /// A reference to the runspace used to start an interactive session. /// public Runspace pushedRunspace = null; /// /// A reference to the listener. /// private PSListenerConsoleSample program; /// /// The culture information of the thread that created this object. /// private CultureInfo originalCultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture; /// /// The UI culture information of the thread that created this object. /// private CultureInfo originalUICultureInfo = System.Threading.Thread.CurrentThread.CurrentUICulture; /// /// The identifier of this instance of the host implementation. /// private static Guid instanceId = Guid.NewGuid(); /// /// A reference to the implementation of the PSHostUserInterface /// class for this application. /// private MyHostUserInterface myHostUserInterface = new MyHostUserInterface(); /// /// Gets the culture information to use. This implementation takes a /// snapshot of the culture information of the thread that created /// this object. /// public override CultureInfo CurrentCulture { get { return this.originalCultureInfo; } } /// /// Gets the UI culture information to use. This implementation takes /// snapshot of the UI culture information of the thread that created /// this object. /// public override CultureInfo CurrentUICulture { get { return this.originalUICultureInfo; } } /// /// Gets the identifier of this instance of the host implementation. /// This implementation always returns the GUID allocated at /// instantiation time. /// public override Guid InstanceId { get { return instanceId; } } /// /// Gets the name of the host implementation. This string may be used /// by script writers to identify when this host is being used. /// public override string Name { get { return "MySampleConsoleHostImplementation"; } } /// /// Gets an instance of the implementation of the PSHostUserInterface class /// for this application. This instance is allocated once at startup time /// and returned every time thereafter. /// public override PSHostUserInterface UI { get { return this.myHostUserInterface; } } /// /// Gets the version object for this host application. Typically /// this should match the version resource in the application. /// public override Version Version { get { return new Version(1, 0, 0, 0); } } #region IHostSupportsInteractiveSession Properties /// /// Gets a value indicating whether a request /// to open a PSSession has been made. /// public bool IsRunspacePushed { get { return this.pushedRunspace != null; } } /// /// Gets or sets the runspace used by the PSSession. /// public Runspace Runspace { get { return this.program.myRunSpace; } internal set { this.program.myRunSpace = value; } } #endregion IHostSupportsInteractiveSession Properties /// /// Instructs the host to interrupt the currently running pipeline /// and start a new nested input loop. Not implemented by this example class. /// The call fails with an exception. /// public override void EnterNestedPrompt() { throw new NotImplementedException("Cannot suspend the shell, EnterNestedPrompt() method is not implemented by MyHost."); } /// /// Instructs the host to exit the currently running input loop. Not /// implemented by this example class. The call fails with an /// exception. /// public override void ExitNestedPrompt() { throw new NotImplementedException("The ExitNestedPrompt() method is not implemented by MyHost."); } /// /// Notifies the host that the Windows PowerShell runtime is about to /// execute a legacy command-line application. Typically it is used /// to restore state that was changed by a child process after the /// child exits. This implementation does nothing and simply returns. /// public override void NotifyBeginApplication() { return; // Do nothing. } /// /// Notifies the host that the Windows PowerShell engine has /// completed the execution of a legacy command. Typically it /// is used to restore state that was changed by a child process /// after the child exits. This implementation does nothing and /// simply returns. /// public override void NotifyEndApplication() { return; // Do nothing. } /// /// Indicate to the host application that exit has /// been requested. Pass the exit code that the host /// application should use when exiting the process. /// /// The exit code that the /// host application should use. public override void SetShouldExit(int exitCode) { this.program.ShouldExit = true; this.program.ExitCode = exitCode; } #region IHostSupportsInteractiveSession Methods /// /// Requests to close a PSSession. /// public void PopRunspace() { Runspace = this.pushedRunspace; this.pushedRunspace = null; } /// /// Requests to open a PSSession. /// /// Runspace to use. public void PushRunspace(Runspace runspace) { this.pushedRunspace = Runspace; Runspace = runspace; } #endregion IHostSupportsInteractiveSession Methods } }