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.dllandSystem.Xaml.dllassemblies 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.exethat comes with this release is the previous version and doesn't include the changes described above. - The
CSI.exein 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.exein 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.dllbecause that assembly is unlikely to be used in common CSI scenarios. If needed, a reference can be added via-r System.Data.DataSetExtensions.dllin the usual manner. (The .NET 4 version of CSI's-Rdoesn'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