This document describes steps for building a C# Cmdlet with Visual Studio in 2 ways:
This demonstrates how to build your own C# cmdlet for PowerShell Core with Visual Studio. Targeting for PowerShell Core means that the cmdlet may not work against Windows PowerShell if you take dependencies on new APIs introduced in PowerShell Core.
We will use the free Visual Studio Community 2017.
When installing Visual Studio 2017 select
.NET Core cross-platform development
under
Other Toolsets
Create new C# project SendGreeting
of type
Class Library (.NET Core)
Now we need to setup PowerShell Core reference assemblies. In
Solution Explorer
right click on project
Dependencies
and select
Manage NuGet Packages...
In the top-right corner of the
package manager click on the small Settings
sprocket icon
that is to the right from Package source
dropdown. By
default, there will be only nuget.org
package source in
Available package sources
list. Add another package source
with name powershell-core
and source
https://powershell.myget.org/F/powershell-core/api/v3/index.json
In the package manager select new powershell-core
in
Package source
dropdown, select Browse
tab,
type in System.Management.Automation
in the search and
select Include prerelease
. It should find
System.Management.Automation
package, select it and it will
show package details; install it using Install
button.
Add the code of cmdlet:
using System.Management.Automation; // PowerShell namespace.
namespace SendGreeting
{
// Declare the class as a cmdlet and specify and
// appropriate verb and noun for the cmdlet name.
[Cmdlet(VerbsCommunications.Send, "Greeting")]
public class SendGreetingCommand : Cmdlet
{
// Declare the parameters for the cmdlet.
[Parameter(Mandatory = true)]
public string Name { get; set; }
// Override the ProcessRecord method to process
// the supplied user name and write out a
// greeting to the user by calling the WriteObject
// method.
protected override void ProcessRecord()
{
WriteObject("Hello " + Name + "!");
}
}
}
At this point everything should look like this:
Build solution (F6); The Output
window will print
the location of generated cmdlet DLL:
Start PowerShell Core, run Import-Module
on DLL path
from previous step and run cmdlet: You can also run the same cmdlet on Linux and other
systems that PowerShell Core supports:
Steps below show how to build your own C# cmdlet for PowerShell Standard 3.0 with Visual Studio. Targeting PowerShell Standard 3.0 means that the same module will work against PowerShell Core as well as Windows PowerShell v3 and newer, however, you are limited to a subset of the available PowerShell APIs.
We will use the free Visual Studio Community 2017.
When installing Visual Studio 2017 select
.NET Core cross-platform development
under
Other Toolsets
Create new C# project SendGreetingStd
of type
Class Library (.NET Standard)
On project properties verify that Target framework
is .NET Standard 2.0
:
Now we need to setup reference assemblies. In
Solution Explorer
right click on project
Dependencies
and select
Manage NuGet Packages...
In the top-right corner of the
package manager select nuget.org
package source, select
Browse
tab, type in PowerShellStandard.Library
in the search and select Include prerelease
. It should find
PowerShellStandard.Library
package, select it and it will
show package details; install it using Install
button.
Add the code of cmdlet:
using System.Management.Automation; // PowerShell namespace.
namespace SendGreeting
{
// Declare the class as a cmdlet and specify and
// appropriate verb and noun for the cmdlet name.
[Cmdlet(VerbsCommunications.Send, "Greeting")]
public class SendGreetingCommand : Cmdlet
{
// Declare the parameters for the cmdlet.
[Parameter(Mandatory = true)]
public string Name { get; set; }
// Override the ProcessRecord method to process
// the supplied user name and write out a
// greeting to the user by calling the WriteObject
// method.
protected override void ProcessRecord()
{
WriteObject("Hello " + Name + "!");
}
}
}
At this point everything should look like this:
Build solution (F6); The Output
window will print
the location of generated cmdlet DLL:
Now cmdlet can be run on systems supported by PowerShell
Standard;
For example:
On PowerShell Core on Windows: On PowerShell Core on
Linux:
On Windows
PowerShell on Windows (this requires .NET
Framework 4.7.1):