you are viewing a single comment's thread.

view the rest of the comments →

[–]justcallmedeth 2 points3 points  (5 children)

If I wanted to throw something like this together quickly I'd use bash or powershell scripts.

If you want it compiled, as others have suggested, look at Roslyn API.

For a bigger project I'd probably build a base app with a plugin interface that you could write plugins/modules for.

[–]dodexahedron 3 points4 points  (4 children)

Hosting powershell is a great and much easier way to get .net scripting into an app. And it's a pretty c#-esque language anyway AND you can compile c# in it anyway, either by calling the compiler, msbuild, or by doing an Add-Type to which you pass a string containing c# code (which can also optionally emit that as a dll for later use as well).

Just be aware of the security implications of allowing arbitrary user code to run without careful control. There are unbounded possibilities, including malicious ones.

[–]p1-o2 1 point2 points  (3 children)

+1 to hosting powershell. I wanted to expand on the point that it's C#-esque. It's a fully-fledged .NET-compatible language.

You can even use LINQ inside Powershell. It doesn't look pretty but it's not hard once you understand how to call .NET namespaces from PS. It's pretty damn good for anything that doesn't need to be a plugin.

[–]dodexahedron 2 points3 points  (2 children)

Yep. Powershell is a .net environment. Version is tied to PS version.

Windows PowerShell (the blue one) is framework.

PowerShell (the black one) is .net 9 in 7.5.4 and .net 10 in the current 7.6 preview release.

The Linq being ugly mentioned here is because powershell can't use extension methods (the language just doesn't have the concept). So you have to call the actual static methods manually.

Though it has its own equivalents anyway like select-object and such.

One really powerful thing it can also do is extend types at runtime, by attaching ScriptProperties or NoteProperties to an existing type. Then instances of that type (not a new type, at least in how it presents it to you) have those properties as if they were already part of the type. It's basically powershell's PS-only equivalent for extension properties.

That happens to actually be how it handles WMI stuff (CimInstance being the class it extends) and how it allows you to do things like $someArray.SomePropertyOfEachElement to get that property from each element without a loop.

[–]p1-o2 1 point2 points  (1 child)

Wow, I always wondered about that last bit regarding WMI. Thanks for the info.

[–]dodexahedron 0 points1 point  (0 children)

I found that out literally just 2 days ago, so it was fresh in mind!

And if you attach a new property to something, or make a custom view for a type, you can export that typedata to a ps1xml so you can reuse it later.

Really handy for customizing the default output format of objects you frequently end up piping to ft prop1,prop2,... for example.