public void TestCallStaticMethod() { var engine = REngine.GetInstance(); ClrProxy.LoadAssembly(PATH); const string typeName = "AssemblyForTests.StaticClass"; const string methodName = "SameMethodName"; ClrProxy.CallStaticMethod(typeName, methodName, null, 0, out _, out _); SymbolicExpression sexp = engine.CreateInteger(1); var arguments = new[] { (long)sexp.DangerousGetHandle() }; ClrProxy.CallStaticMethod(typeName, methodName, arguments, arguments.Length, out _, out _); sexp = engine.CreateNumeric(1.0); arguments = new[] { (long)sexp.DangerousGetHandle() }; ClrProxy.CallStaticMethod(typeName, methodName, arguments, arguments.Length, out _, out _); sexp = REngineExtension.CreateIntegerVector(engine, new[] { 1, 2, 3 }); arguments = new[] { (long)sexp.DangerousGetHandle() }; ClrProxy.CallStaticMethod(typeName, methodName, arguments, arguments.Length, out _, out _); sexp = REngineExtension.CreateNumericVector(engine, new[] { 1.0, 2.0, 3.0 }); arguments = new[] { (long)sexp.DangerousGetHandle() }; ClrProxy.CallStaticMethod(typeName, methodName, arguments, arguments.Length, out _, out _); sexp = engine.CreateNumeric(1.0); SymbolicExpression sexp2 = engine.CreateInteger(1); arguments = new[] { (long)sexp.DangerousGetHandle(), (long)sexp2.DangerousGetHandle() }; ClrProxy.CallStaticMethod(typeName, methodName, arguments, arguments.Length, out _, out _); sexp = REngineExtension.CreateNumericVector(engine, new[] { 1.0, 2.0, 3.0 }); sexp2 = REngineExtension.CreateIntegerVector(engine, new[] { 1, 2, 3 }); arguments = new[] { (long)sexp.DangerousGetHandle(), (long)sexp2.DangerousGetHandle() }; ClrProxy.CallStaticMethod(typeName, methodName, arguments, arguments.Length, out _, out _); sexp = engine.CreateInteger(1); sexp2 = REngineExtension.CreateNumericVector(engine, new[] { 1.0, 2.0, 3.0 }); arguments = new[] { (long)sexp2.DangerousGetHandle(), (long)sexp.DangerousGetHandle() }; ClrProxy.CallStaticMethod(typeName, methodName, arguments, arguments.Length, out _, out _); sexp = REngineExtension.CreateIntegerVector(engine, new[] { 1, 2, 3 }); sexp2 = engine.CreateNumeric(1.0); arguments = new[] { (long)sexp2.DangerousGetHandle(), (long)sexp.DangerousGetHandle() }; ClrProxy.CallStaticMethod(typeName, methodName, arguments, arguments.Length, out _, out _); Assert.IsTrue(ClrProxy.CreateObject("AssemblyForTests.DefaultCtorData", null, 0, out var externalPtr)); arguments = new[] { externalPtr }; ClrProxy.CallStaticMethod(typeName, methodName, arguments, arguments.Length, out _, out _); }
private IntPtr CallDeviceFunction(IntPtr call, IntPtr operation, IntPtr args, IntPtr environment, Func <Language, SymbolicExpression, Pairlist, REnvironment, SymbolicExpression> func) { var c = new Language(Engine, call); var op = new SymbolicExpression(Engine, operation); var arglist = new Pairlist(Engine, args); var env = new REnvironment(Engine, environment); SymbolicExpression result = func(c, op, arglist, env); return(result.DangerousGetHandle()); }
public static Type[] ExtractTypes(SymbolicExpression sexp) { var tagPtr = sexp.Engine.GetFunction <R_ExternalPtrTag>()(sexp.DangerousGetHandle()); var tag = sexp.Engine.CreateFromNativeSexp(tagPtr).AsCharacter().ToArray(); if (tag == null || tag.Length != 2) { throw new InvalidOperationException("This external pointer isn't supported"); } if (string.Equals(tag[0], NET_OBJ_TAG)) { var typeAsString = tag[1]; if (typeAsString.TryGetType(out var type, out var _)) { return(type.GetFullHierarchy()); } return(new[] { typeof(object) }); } throw new InvalidOperationException($"This external pointer isn't supported, the tag should starts with {NET_OBJ_TAG} value"); }
private static object ReturnHandle(SymbolicExpression sexp) { AddSexpHandle(sexp); return(sexp.DangerousGetHandle()); }
/// <summary> /// Defines a symbol in this environment. /// </summary> /// <param name="name">The name.</param> /// <param name="expression">The symbol.</param> public void SetSymbol(string name, SymbolicExpression expression) { if (name == null) { throw new ArgumentNullException("name", "'name' cannot be null"); } if (name == string.Empty) { throw new ArgumentException("'name' cannot be an empty string"); } if (expression == null) { expression = Engine.NilValue; } if (expression.Engine != this.Engine) { throw new ArgumentException(); } IntPtr installedName = this.GetFunction<Rf_install>()(name); this.GetFunction<Rf_defineVar>()(installedName, expression.DangerousGetHandle(), handle); }
public object Convert(Type type) { var pointer = _sexp.Engine.GetFunction <R_ExternalPtrAddr>()(_sexp.DangerousGetHandle()); return(Marshal.GetObjectForIUnknown(pointer)); }