Slim managed any cpu (x86/x64) .net wrapper of Microsoft.ChakraCore (https://github.com/Microsoft/ChakraCore)
- Install SharpChakra nuget
- Install SharpChakra.Json nuget (Json Interop)
- Install SharpChakra.Extensions nuget (Extensions)
- Any cpu (auto proxy to x86/x64)
- Slim (no extra logic, only Api)
- Module API support (es6 import/export)
- Diagnostic API support (breakpoints, evals)
- Memory limitation
- JSON interopability
- Object proxy
Microsoft.ChakraCore 1.8.4
The binaries can be found in the directory src\SharpChakra\runtimes
.
using (var runtime = JsRuntime.Create())
{
var context = runtime.CreateContext();
var fn = new JsNativeFunctionBuilder();
// Register run function
context.Global.SetProperty("run", fn.New(() =>Console.WriteLine("hello from script!")), true);
context.RunScript("run();");
}
Output: 'hello from script!'
using (var runtime = JsRuntime.Create())
{
var context = runtime.CreateContext();
var fn = new JsNativeFunctionBuilder();
// register dump function
var dumpFunc = fn.New(_x =>
{
Console.WriteLine("-- dump --");
Console.WriteLine(_x.Arguments[1].ToJToken().ToString(Formatting.Indented));
return JObject.Parse("{status:'ok',error:-1}").ToJsValue();
});
context.Global.SetProperty("dump", dumpFunc, true);
Console.WriteLine("-- executing --");
var res = context.RunScript("dump({id:4,name:'chakra'});");
Console.WriteLine("-- result --");
Console.WriteLine(res.ToJToken().ToString(Formatting.Indented));
}
Output:
-- executing --
-- dump --
{
"id": 4,
"name": "chakra"
}
-- result --
{
"status": "ok",
"error": -1
}
var builder = new JsNativeFunctionBuilder();
using (var runtime = JsRuntime.Create(JsRuntimeAttributes.EnableExperimentalFeatures, JsRuntimeVersion.VersionEdge))
{
var context = runtime.CreateContext();
var jsCtx = JsValue.CreateObject();
context.Global
.SetProperty("ctx", jsCtx, true)
.SetProperty("proxy", JsProxy.New(new TestProxy(), builder), true);
context.RunScript(@"
proxy.EchoHello();
proxy.Echo(proxy.TestArgs(100,'string',1.0/3.0));
proxy.EchoComplex(proxy.ConstComplex);
proxy.EchoComplex({'X':100,'Y':500});
");
}
where TextProxy:
struct ComplexType
{
public int X { get; set; }
public int Y { get; set; }
}
class TestProxy
{
private int p_callCount;
public string Name => $"TestProxy Object [{p_callCount++}]";
public void EchoHello() => Console.WriteLine("Hello");
public void Echo(string _s) => Console.WriteLine(_s);
public ComplexType ConstComplex { get; } = new ComplexType { X = 1, Y = 5 };
public void EchoComplex(ComplexType _x) => Console.WriteLine($"X:{_x.X}, Y:{_x.Y}");
public string TestArgs(int _a, string _s, double _d)
{
var t = $"int:{_a}, string: {_s}, double: {_d}";
Console.WriteLine(t);
return t;
}
}
Output:
Hello
int:100, string: string, double: 0,333333343267441
int:100, string: string, double: 0,333333343267441
X:1, Y:5
X:100, Y:500
N | host | Dir | chakracore.dll | Comment |
---|---|---|---|---|
1. | Load top level script | |||
2. | ----> | JsInitializeModuleRecord | for root module | |
3. | ----> | JsParseModuleSource | parse root module | |
4. | FetchImportedModuleCallback | <---- | optional for imported module | |
5. | -----> | JsInitializeModuleRecord | for nested module | |
6. | load additional script | |||
7. | -----> | JsParseModuleSource | for nested module | |
8. | NotifyModuleReadyCallback | <----- | ||
9. | -----> | JsModuleEvaluation | for root module |
using (var runtime = JsRuntime.Create(JsRuntimeAttributes.EnableExperimentalFeatures,JsRuntimeVersion.VersionEdge))
{
var context = runtime.CreateContext();
var fn = new JsNativeFunctionBuilder();
// register echo func
context.Global.SetProperty("echo", fn.New(_x => Console.WriteLine(_x.Arguments[1].ToString())), true);
var mainModule = JsModuleRecord.Create(JsModuleRecord.Root, JsValue.FromString("")); // 2. JsInitializeModuleRecord
var fooModule = JsModuleRecord.Invalid;
JsErrorCode onFetch(JsModuleRecord _module, JsValue _specifier, out JsModuleRecord _record) // 4. FetchImportedModuleCallback
{
fooModule = JsModuleRecord.Create(_module, _specifier); // 2. JsInitializeModuleRecord (foo.js)
_record = fooModule;
return JsErrorCode.NoError;
}
mainModule.SetHostInfo(onFetch);
var rootSrc =
@"
import {test} from 'foo.js';
echo(test());
";
mainModule.Parse(rootSrc); // 3. JsParseModuleSource(root)
fooModule.Parse("export let test = function(){return 'hello';}"); //3. JsParseModuleSource(foo.js)
mainModule.Eval(); // 9. JsModuleEvaluation(main)->import {test}->test()->echo(test())->echo('hello')-> hello
}
Output: hello
JsrtCommonExports.inc
Function | Status |
---|---|
JsSetObjectBeforeCollectCallback | done |
JsCreateRuntime | done |
JsCollectGarbage | done |
JsDisposeRuntime | done |
JsAddRef | done |
JsRelease | done |
JsCreateContext | done |
JsGetCurrentContext | done |
JsSetCurrentContext | done |
JsGetContextOfObject | done |
JsRunScript | done |
JsGetUndefinedValue | done |
JsGetNullValue | done |
JsGetTrueValue | done |
JsGetFalseValue | done |
JsBoolToBoolean | done |
JsBooleanToBool | done |
JsConvertValueToBoolean | done |
JsGetValueType | done |
JsDoubleToNumber | done |
JsIntToNumber | done |
JsNumberToDouble | done |
JsNumberToInt | done |
JsConvertValueToNumber | done |
JsPointerToString | done |
JsStringToPointer | done |
JsConvertValueToString | done |
JsGetGlobalObject | done |
JsCreateObject | done |
JsCreateExternalObject | done |
JsConvertValueToObject | done |
JsGetPrototype | done |
JsSetPrototype | done |
JsInstanceOf | done |
JsGetExtensionAllowed | done |
JsPreventExtension | done |
JsGetProperty | done |
JsGetOwnPropertyDescriptor | done |
JsSetProperty | done |
JsHasProperty | done |
JsDeleteProperty | done |
JsDefineProperty | done |
JsCreateArray | done |
JsCreateArrayBuffer | done |
JsCreateExternalArrayBuffer | done |
JsCreateTypedArray | done |
JsCreateDataView | done |
JsGetTypedArrayInfo | done |
JsGetArrayBufferStorage | done |
JsGetTypedArrayStorage | done |
JsGetDataViewStorage | done |
JsHasIndexedProperty | done |
JsGetIndexedProperty | done |
JsSetIndexedProperty | done |
JsDeleteIndexedProperty | done |
JsHasIndexedPropertiesExternalData | done |
JsGetIndexedPropertiesExternalData | done |
JsSetIndexedPropertiesToExternalData | done |
JsEquals | done |
JsStrictEquals | done |
JsHasExternalData | done |
JsGetExternalData | done |
JsSetExternalData | done |
JsCallFunction | done |
JsCreateFunction | done |
JsCreateNamedFunction | done |
JsCreateError | done |
JsCreateRangeError | done |
JsCreateReferenceError | done |
JsCreateSyntaxError | done |
JsCreateTypeError | done |
JsCreateURIError | done |
JsHasException | done |
JsGetAndClearException | done |
JsSetException | done |
JsGetRuntimeMemoryUsage | done |
JsGetRuntimeMemoryLimit | done |
JsSetRuntimeMemoryLimit | done |
JsSetRuntimeMemoryAllocationCallback | done |
JsSetRuntimeBeforeCollectCallback | done |
JsGetStringLength | done |
JsDisableRuntimeExecution | done |
JsEnableRuntimeExecution | done |
JsIsRuntimeExecutionDisabled | done |
JsSerializeScript | done |
JsParseSerializedScript | done |
JsRunSerializedScript | done |
JsParseSerializedScriptWithCallback | done |
JsRunSerializedScriptWithCallback | done |
JsParseScript | done |
JsParseScriptWithAttributes | done |
JsConstructObject | done |
JsGetPropertyIdFromName | done |
JsGetPropertyNameFromId | done |
JsGetPropertyIdType | done |
JsGetOwnPropertyNames | done |
JsGetPropertyIdFromSymbol | done |
JsGetSymbolFromPropertyId | done |
JsCreateSymbol | done |
JsGetOwnPropertySymbols | done |
JsGetRuntime | done |
JsIdle | done |
JsSetPromiseContinuationCallback | done |
ChakraCore.def
Function | Status |
---|---|
JsDiagEvaluate | done |
JsDiagGetBreakOnException | - |
JsDiagGetBreakpoints | done |
JsDiagGetFunctionPosition | - |
JsDiagGetProperties | - |
JsDiagGetScripts | done |
JsDiagGetSource | - |
JsDiagGetStackProperties | - |
JsDiagGetStackTrace | - |
JsDiagGetObjectFromHandle | - |
JsDiagRemoveBreakpoint | done |
JsDiagRequestAsyncBreak | done |
JsDiagSetBreakOnException | - |
JsDiagSetBreakpoint | done |
JsDiagSetStepType | - |
JsDiagStartDebugging | done |
JsDiagStopDebugging | done |
JsTTDCreateRecordRuntime | - |
JsTTDCreateReplayRuntime | - |
JsTTDCreateContext | - |
JsTTDNotifyContextDestroy | - |
JsTTDStart | - |
JsTTDStop | - |
JsTTDPauseTimeTravelBeforeRuntimeOperation | - |
JsTTDReStartTimeTravelAfterRuntimeOperation | - |
JsTTDNotifyYield | - |
JsTTDNotifyLongLivedReferenceAdd | - |
JsTTDHostExit | - |
JsTTDRawBufferCopySyncIndirect | - |
JsTTDRawBufferModifySyncIndirect | - |
JsTTDRawBufferAsyncModificationRegister | - |
JsTTDRawBufferAsyncModifyComplete | - |
JsTTDCheckAndAssertIfTTDRunning | - |
JsTTDGetSnapTimeTopLevelEventMove | - |
JsTTDGetSnapShotBoundInterval | - |
JsTTDGetPreviousSnapshotInterval | - |
JsTTDPreExecuteSnapShotInterval | - |
JsTTDMoveToTopLevelEvent | - |
JsTTDReplayExecution | - |
JsInitializeModuleRecord | done |
JsParseModuleSource | done |
JsModuleEvaluation | done |
JsSetModuleHostInfo | done |
JsGetModuleHostInfo | - |
JsInitializeJITServer | - |
JsCreateSharedArrayBufferWithSharedContent | - |
JsGetSharedArrayBufferContent | - |
JsReleaseSharedArrayBufferContentHandle | - |
Code licensed under the MIT License.