electron-clr
Version:
Electron binding for .NET Framework API
218 lines (135 loc) • 5.1 kB
Markdown
A fork of node-clr with precompiled Electron native modules and duck typing.
To build native modules for a new Electron version:
build.cmd electron.version.here
# node-clr : .NET Framework API Binding for Node.js
## Usage:
# npm install electron-clr
# node
> require('electron-clr').init();
> System.Console.WriteLine('Hello, {0}!', 'world');
'Hello, world!'
> var now = new System.DateTime(2013, 7, 1);
> now.ToString();
'2013/07/01 0:00:00'
> require('clr').init({ assemblies: [ 'System.Windows.Forms' ] });
> with (System.Windows.Forms) {
> var f = new Form();
>
> var p = new FlowLayoutPanel();
> f.Controls.Add(p);
>
> var t = new TextBox();
> t.Text = 'world';
> p.Controls.Add(t);
>
> var b = new Button();
> b.Text = 'Greet';
> b.Click.add(function (thiz, ea) {
> console.log('clicked');
> MessageBox.Show('Hello, ' + t.Text + '!');
> });
> p.Controls.Add(b);
>
> Application.Run(f);
> }
(running WinForm application)
## Prerequisites:
This library is built and tested on following environment:
- Node.js v0.12.1
- .NET Framework 4.5
- Visual Studio 2013
- [Node.js native module build environment](https://github.com/TooTallNate/node-gyp)
## clr.init([options])
Initialize CLR rutime with given options. Returns global `namespace`.
- `options` {Object}
- `assemblies` {Array} - An array of assembly name (partial name, full name or absolute path to .dll/.exe).
Defaults to `['mscorlib', 'System', 'System.Core']`.
- `global` {boolean} - if `true`, CLR global namespace objects are injected into javascript global object.
Defaults to `true`.
## CLR namespaces
- {Object}
CLR namespace objects contain nested namespaces or types.
## CLR types
- {Function}
CLR type functions work as constructor for corresponding CLR types.
The constructor returns wrapped CLR object.
var now = new System.DateTime(2013, 7, 1);
The code above invokes CLR constructor [`DateTime (Int32, Int32, Int32)`](http://msdn.microsoft.com/ja-jp/library/xcfzdy4x.aspx)
and returns {Object} that wraps `DateTime` instance.
CLR type also contains static members.
var now = System.DateTime.Now;
The code above invokes CLR static property getter [`DateTime.Now`](http://msdn.microsoft.com/ja-jp/library/system.datetime.now.aspx).
### type.of([type])
Bind generic parameters to type and returns bound CLR type.
var list = new (System.Collections.Generic.List.of(System.Int32))();
## CLR objects
- {Object}
Javascript object that wraps CLR instance, which contains instance members.
var now = System.DateTime.Now;
now.ToString();
> '2013/07/01 0:00:00'
## CLR methods
- {Function}
CLR methods can be invoked as Javascript function. Arguments and return value are marshalled as conventions below.
System.Console.WriteLine('Hello, {0}!', 'world');
> 'Hello, world!'
## CLR properties/fields
- {Getter/Setter}
CLR properties/fields are exposed as object's getter or setter function.
var now = System.DateTime.Now;
## CLR indexed properties
### obj.get([index])
Get object's default indexed property
var a =
### obj.set([index], value)
## CLR events
- {Object}
CLR events can be hooked by `add` and `remove` function.
### event.add(handler)
Add javascript event handler to specified event.
- `handler` {Function}
### event.remove(handler)
Remove javascript event handler from event.
** This isn't working right now **
- `handler` {Function}
## Marshaling:
V8 => CLR:
- `null` or `undefined` => `null`
- `boolean` => `System.Boolean`
- `number` => Any numeric type or `System.Double`
- `string` => `System.String` or `System.Char` or Enums
- `Function` => Any delegate type or `System.Func<System.Object[], System.Object>`
- `Array` => Any type of array or `System.Object[]`
- `Buffer` => `System.Byte[]`
- `object` => `System.Dynamic.ExpandoObject`
CLR => V8:
- `null` => `null`
- `System.Boolean` => `boolean`
- Any numberic type excepts System.Decimal => `number`
- `System.String` or `System.Char` => `string`
- Any other types => CLR wrapped object
## Duck typing
const implementedInterface = new IMyInterface({
MyFunc: () => 10,
set_Prop: value => {},
get_Prop: () => 12
});
## Threading:
You can use .NET threads. All Javascript callback functions are invoked in main event loop.
var t = new System.Threading.Thread(function () {
console.log('Hello, world!');
});
t.Start();
> 'Hello, world!' // will be invoked asynchronously, but in main thread
## TODO:
- Unit test
- Better marshaling
- `Object` => class with `DataContractAttribute`
- handle cyclic reference
- New Event api, resembles to EventEmitter
- Prototype chain which reflects CLR inheritance
- Generic method
- cast
- valueOf (explicit conversion from wrapped CLR object to javascript types)
- Async invocation
- Compiler API