scope_creep
scope_creep

Reputation: 4251

Whats the best way to wrap a c# class for use by powershell script

I have an engine that executes powershell scripts, and when they execute, need to feed back in some xml to the caller. The engine only takes i/o as an idmef xml message. So the script needs to return a similarly formatted xml message. I have a class which does my formatting for me and it would like the script writers to use it.

So question is I want to wrap a c# class to enable it to be used by powershell.

I saw something some where you can refer to c# class using the square bracket mob, eg.

How to you make the c# available to be used like this. I reckon it needs to be made into class lib and somehow loaded into the powershell runtime but how. Also as I'm running the powershell from c#, how do I add it into the environment at that point.

Any help would be appreciated. Bob.

Upvotes: 1

Views: 1001

Answers (4)

Nestor
Nestor

Reputation: 13990

I would write a Cmdlet in C# that takes a bunch of parameters and spits out the XML that you want. Then you can use that Cmdlet from Powershell by piping things into it. I hope this helps!

Upvotes: 0

Steven Murawski
Steven Murawski

Reputation: 11270

If have an assembly (exe or dll) with the class in it, PowerShell can load it via [System.Reflection.Assembly]::LoadFile("PathToYourAssembly") or in V2

Add-Type -Path "PathToYourAsembly"

If you are creating a runspace in your application and would like to make an assembly available, you can do that with a RunspaceConfiguration.

RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();
AssemblyConfigurationEntry myAssembly = new AssemblyConfigurationEntry("strong name for my assembly", "optional path to my assembly");
rsConfig.Assemblies.Append(myAssembly);
Runspace myRunSpace = RunspaceFactory.CreateRunspace(rsConfig);
myRunSpace.Open();

Upvotes: 3

Chad Miller
Chad Miller

Reputation: 41777

Dealing with interfaces in PowerShell is very difficult if not impossible at least in V1, so avoid these in your class. In PowerShell a simple [reflection.assembly]::Load or LoadFile is all it takes.

Upvotes: 1

John Saunders
John Saunders

Reputation: 161773

I don't think anything is necessary. You can access pretty much the entire .NET Framework from PowerShell. I'm sure they didn't create any wrappers to do it.

Upvotes: 2

Related Questions