private EmbeddedObject CreateEmbeddedFunction(Delegate del)
{
JsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) =>
{
#if NET40
MethodInfo method = del.Method;
#else
MethodInfo method = del.GetMethodInfo();
#endif
ParameterInfo[] parameters = method.GetParameters();
object[] processedArgs = GetHostItemMemberArguments(args, parameters.Length);
ReflectionHelpers.FixArgumentTypes(ref processedArgs, parameters);
object result;
try
{
result = del.DynamicInvoke(processedArgs);
}
catch (Exception e)
{
JsValue undefinedValue = JsValue.Undefined;
Exception exception = UnwrapException(e);
var wrapperException = exception as WrapperException;
JsValue errorValue = wrapperException != null?
CreateErrorFromWrapperException(wrapperException)
:
JsErrorHelpers.CreateError(string.Format(
Strings.Runtime_HostDelegateInvocationFailed, exception.Message))
;
JsContext.SetException(errorValue);
return(undefinedValue);
}
JsValue resultValue = MapToScriptType(result);
return(resultValue);
};
GCHandle delHandle = GCHandle.Alloc(del);
IntPtr delPtr = GCHandle.ToIntPtr(delHandle);
JsValue objValue = JsValue.CreateExternalObject(delPtr, _embeddedObjectFinalizeCallback);
JsValue functionValue = JsValue.CreateFunction(nativeFunction);
SetNonEnumerableProperty(functionValue, ExternalObjectPropertyName, objValue);
var embeddedObject = new EmbeddedObject(del, functionValue,
new List <JsNativeFunction> {
nativeFunction
});
return(embeddedObject);
}