Ragoler
Ragoler

Reputation: 1271

Running scripts inside C#

I want to run javascript/Python/Ruby inside my application.

I have an application that creates process automatically based on user's definition. The process is generated in C#. I want to enable advanced users to inject script in predefined locations. Those scripts should be run from the C# process. For example, the created process will have some activities and in the middle the script should be run and then the process continues as before. Is there a mechanism to run those scripts from C#?

Upvotes: 6

Views: 14063

Answers (9)

kzotin
kzotin

Reputation: 5365

Awesome C# scripting language - Script.Net

Upvotes: 1

Sheepy
Sheepy

Reputation: 18005

One of Microsoft's solutions to JavaScript in C# is ClearScript, which uses V8, Chrom browser's JavaScript engine. Check its short FAQtorial for code samples.

It has excellent two-way integration - iterator/enumerator, output parameters, optional parameters, parameter arrays, delegate, task/promise/async/await, bigint, and more.

Apart from that, I think the most distinguishing feature is that it does not depend on Rosyln or Dynamic Language Runtime. This can be good or bad - good because there may be a lot less dependencies (depending on your project's target), bad because you need to bundle the native, platform-dependent V8 dll.

If that is ok, you get to enjoy cutting edge JavaScript / ECMAScript. Everything you get on Chrome, or 98% ES6 as of 2022 Feb, plus several extensions. Speed is as fast as Chrome, obviously, so you get the best of both Google and Microsoft.

Upvotes: 0

Steven Murawski
Steven Murawski

Reputation: 11270

.NET has a scripting language including runtime engine in PowerShell which can be embedded in any .NET application.

Upvotes: 1

Silver Dragon
Silver Dragon

Reputation: 5560

Basically, you have two problems: how to define point of injections in your generated code, and how to run python / ruby / whatev scripts from there.

Depending on how you generate the process, one possible solution would be to add a function to each possible point of injection. The function would check, whether the user has associated any scripts with given points, and if so, runs the script by invoking IronPython / IronRuby (with optionally given parameters).

Disadvantages include: limited accessibility from the scripts to the created process (basically, only variables passed as parameters could be accessed); as well as implementation limits (IronPython's current version omits several basic system functions).

Upvotes: 5

Will Dean
Will Dean

Reputation: 39500

I've done exactly this just recently - allowed run-time addition of C# scripting.

It's not hard at all, and this article:

http://www.divil.co.uk/net/articles/plugins/scripting.asp

is a very useful summary of the details.

Upvotes: 0

AngryHacker
AngryHacker

Reputation: 61616

Have you thought about Visual Studio for Applications? I haven't heard much about it since .NET 1.1, but it might be worth a look.

http://msdn.microsoft.com/en-us/library/ms974548.aspx

Upvotes: 0

GvS
GvS

Reputation: 52518

You can compile C# code "on the fly" into an in-memory assembly. I think this is possible with IronPython and IronRuby as well. Look at the CodeDomProvider.CreateProvider method.

If you need to run scripts a lot, or if your process runs for a long time, you might want to load these assemblies into another AppDomain. And unload the AppDomain after you're done with the script. Otherwise you are unable to remove them from memory. This has some consequenses on the other classes in your project, because you have to marshall all calls.

Upvotes: 0

Serafina Brocious
Serafina Brocious

Reputation: 30609

Look into IronPython and IronRuby -- these will allow you to easily interoperate with C#.

Upvotes: 2

jussij
jussij

Reputation: 10560

You can compile C# code from within a C# application using the CSharpCodeProvider class.

If the compile succeeds you can run the resulting assembly as returned via the CompiledAssembly property of the CompilerResults class.

Upvotes: 1

Related Questions