The source code IS (still) the executable [Updated CSI, a C# interpreter (with source and tests) for .NET 4]
I published CSI, a simple C# interpreter, exactly one year ago. In that introductory post, I explained how CSI offers a nice alternative to typical CMD-based batch files by enabling the use of the full .NET framework and stand-alone C# source code files for automating simple, repetitive tasks. CSI accomplishes this by compiling source code "on the fly" and executing the resulting assembly seamlessly. What this means for users is that it's easy to represent tasks with a simple, self-documenting code file and never need to worry about compiling a binary, trying to keep it in sync with changes to the code, or even tracking project files and remembering how to build it in the first place!
Aside: The difference may not seem like much at first, but once you start thinking in terms of running .CS files instead of running .EXE files, things just seem to get simpler and more transparent!:)
And I'm happy to say that today, on the first birthday of CSI's public introduction, I'm releasing a new version!
Notes:
- Today's release of CSI includes
CSI40.exe
, a version of CSI that uses the .NET 4 Beta 2 Framework to enable the execution of programs that take full advantage of the latest .NET Framework! Correspondingly, the-R
"include common references" switch now includes the newMicrosoft.CSharp.dll
andSystem.Xaml.dll
assemblies that are part of .NET 4. This new version of CSI makes it easy to take advantage of the late-binding dynamic type, the push-based IObservable interface, the handy Tuple class, or any of the other neat, new features of .NET 4. - CSI previously required a program's entry point be of the
Main(string[] args)
kind and would fail if asked to run a program using the (also valid)Main()
form. This restriction has been lifted and all new flavors of CSI will successfully call into a parameter-less entry point. - CSI could formerly fail to execute programs requiring the single-threaded apartment model. While this probably wasn't an issue for most people because apartment models don't matter much in general, if you were working in an area where it did matter (like WPF), things were unnecessarily difficult. No longer - CSI's entry point has been decorated with the STAThread attribute, and it now runs STA programs smoothly.
- Please note that I have not updated the .NET 1.1 version of CSI,
CSI11.exe
, for this release. There don't seem to be enough people running .NET 1.1 (and expecting updates!) for it to be worth creating a virtual machine and installing .NET 1.1 just to compile a new version of CSI for that platform. Therefore, the version ofCSI11.exe
that comes with this release is the previous version and doesn't include the changes described above. - The
CSI.exe
in the root of the release folder corresponds to the .NET 3.5 version of CSI; this is the "official" version just as it was with the previous release. The fileCSI40.exe
in the same folder is the .NET 4 Beta 2 version of CSI (the obvious heir apparent, but not king quite yet...). Previous versions (CSI30.exe
,CSI20.exe
, andCSI11.exe
) can be found in the "Previous Versions" folder. - The
-R
"include common references" switch of the .NET 3.5 version of CSI no longer includes a reference toSystem.Data.DataSetExtensions.dll
because that assembly is unlikely to be used in common CSI scenarios. If needed, a reference can be added via-r System.Data.DataSetExtensions.dll
in the usual manner. (The .NET 4 version of CSI's-R
doesn't reference this assembly, either, but because this is the first release ofCSI40.exe
, it's not a breaking change.)
For fun, here's an example of the new Main()
support:
C:\T>type Main.cs public class Test { public static void Main() { System.Console.WriteLine("Hello world"); } } C:\T>CSI Main.cs Hello world
And here's an example of the new ability to run WPF code. Note that I've used the RegisterCSI.cmd
script (included with the release; see here for details) to register the .CSI file type with Windows to make it even easier to run CSI-based programs. (And by the way, check out how easy it is to output the default style of a WPF control!)
C:\T>type WpfDefaultStyleBrowser.csi
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Markup;
using System.Xml;
class WpfDefaultStyleBrowser
{
[STAThread]
public static void Main()
{
Style style = (new FrameworkElement()).FindResource(typeof(ContentControl)) as Style;
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.NewLineOnAttributes = true;
settings.OmitXmlDeclaration = true;
XamlWriter.Save(style, XmlWriter.Create(Console.Out, settings));
}
}
C:\T>WpfDefaultStyleBrowser.csi
<Style
TargetType="ContentControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Style.Resources>
<ResourceDictionary />
</Style.Resources>
<Setter
Property="Control.Template">
<Setter.Value>
<ControlTemplate
TargetType="ContentControl">
<ContentPresenter
Content="{TemplateBinding ContentControl.Content}"
ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Finally, here's the contents of the "read me" file, with the CSI syntax, release notes, and version history:
================================================== == CSI: C# Interpreter == == David Anson (http://blogs.msdn.com/delay/) == ================================================== Summary ======= CSI: C# Interpreter Version 2010-01-04 for .NET 3.5 http://blogs.msdn.com/delay/ Enables the use of C# as a scripting language by executing source code files directly. The source code IS the executable, so it is easy to make changes and there is no need to maintain a separate EXE file. CSI (CodeFile)+ (-d DEFINE)* (-r Reference)* (-R)? (-q)? (-c)? (-a Arguments)? (CodeFile)+ One or more C# source code files to execute (*.cs) (-d DEFINE)* Zero or more symbols to #define (-r Reference)* Zero or more assembly files to reference (*.dll) (-R)? Optional 'references' switch to include common references (-q)? Optional 'quiet' switch to suppress unnecessary output (-c)? Optional 'colorless' switch to suppress output coloring (-a Arguments)? Zero or more optional arguments for the executing program The list of common references included by the -R switch is: System.dll System.Data.dll System.Drawing.dll System.Windows.Forms.dll System.Xml.dll PresentationCore.dll PresentationFramework.dll WindowsBase.dll System.Core.dll System.Xml.Linq.dll CSI's return code is 2147483647 if it failed to execute the program or 0 (or whatever value the executed program returned) if it executed successfully. Examples: CSI Example.cs CSI Example.cs -r System.Xml.dll -a ArgA ArgB -Switch CSI ExampleA.cs ExampleB.cs -d DEBUG -d TESTING -R Notes ===== CSI was inspired by net2bat, an internal .NET 1.1 tool whose author had left Microsoft. CSI initially added support for .NET 2.0 and has now been extended to support .NET 3.0, 3.5, and 4.0. Separate executables are provided to accommodate environments where the latest version of .NET is not available. Version History =============== Version 2010-01-04 Add .NET 4 (Beta 2) version Minor updates Version 2009-01-06 Initial public release Version 2005-12-15 Initial internal release