예제 #1
0
        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 _);
        }
예제 #2
0
        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());
        }
예제 #3
0
        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");
        }
예제 #4
0
 private static object ReturnHandle(SymbolicExpression sexp)
 {
     AddSexpHandle(sexp);
     return(sexp.DangerousGetHandle());
 }
예제 #5
0
 /// <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);
 }
예제 #6
0
        public object Convert(Type type)
        {
            var pointer = _sexp.Engine.GetFunction <R_ExternalPtrAddr>()(_sexp.DangerousGetHandle());

            return(Marshal.GetObjectForIUnknown(pointer));
        }