Example #1
0
        /// <summary>
        /// Gets the callbacks.
        /// </summary>
        private static Callbacks GetCallbacks(Env env, Jvm jvm)
        {
            if (AppDomain.CurrentDomain.IsDefaultAppDomain())
            {
                return(new Callbacks(env, jvm));
            }

            // JVM exists once per process, and JVM callbacks exist once per process.
            // We should register callbacks ONLY from the default AppDomain (which can't be unloaded).
            // Non-default appDomains should delegate this logic to the default one.
            var defDomain = AppDomains.GetDefaultAppDomain();

            // In some cases default AppDomain is not able to locate Apache.Ignite.Core assembly.
            // First, use CreateInstanceFrom to set up the AssemblyResolve handler.
            var resHelpType = typeof(AssemblyResolver);
            var resHelp     = (AssemblyResolver)defDomain.CreateInstanceFrom(resHelpType.Assembly.Location, resHelpType.FullName)
                              .Unwrap();

            resHelp.TrackResolve(resHelpType.Assembly.FullName, resHelpType.Assembly.Location);

            // Now use CreateInstance to get the domain helper of a properly loaded class.
            var type   = typeof(CallbackAccessor);
            var helper = (CallbackAccessor)defDomain.CreateInstance(type.Assembly.FullName, type.FullName).Unwrap();

            return(helper.GetCallbacks());
        }
Example #2
0
        /// <summary>
        /// Gets the callbacks.
        /// </summary>
        private static Callbacks GetCallbacksFromDefaultDomainImpl()
        {
            // JVM exists once per process, and JVM callbacks exist once per process.
            // We should register callbacks ONLY from the default AppDomain (which can't be unloaded).
            // Non-default appDomains should delegate this logic to the default one.
            var defDomain = AppDomains.GetDefaultAppDomain();

            // In some cases default AppDomain is not able to locate Apache.Ignite.Core assembly.
            // First, use CreateInstanceFrom to set up the AssemblyResolve handler.
            var resHelpType = typeof(AssemblyResolver);

            var handle  = InvokeMethod(defDomain, "CreateInstanceFrom", resHelpType.Assembly.Location, resHelpType.FullName);
            var resHelp = (AssemblyResolver)InvokeMethod(handle, "Unwrap");

            resHelp.TrackResolve(resHelpType.Assembly.FullName, resHelpType.Assembly.Location);

            // Now use CreateInstance to get the domain helper of a properly loaded class.
            var type         = typeof(CallbackAccessor);
            var helperHandle = InvokeMethod(defDomain, "CreateInstance", type.Assembly.FullName, type.FullName);
            var helper       = (CallbackAccessor)InvokeMethod(helperHandle, "Unwrap");

            return(helper.GetCallbacks());
        }
Example #3
0
        /// <summary>
        /// Gets the callbacks.
        /// </summary>
        private static Callbacks GetCallbacksFromDefaultDomain()
        {
#if !NETCOREAPP2_0
            // JVM exists once per process, and JVM callbacks exist once per process.
            // We should register callbacks ONLY from the default AppDomain (which can't be unloaded).
            // Non-default appDomains should delegate this logic to the default one.
            var defDomain = AppDomains.GetDefaultAppDomain();

            // In some cases default AppDomain is not able to locate Apache.Ignite.Core assembly.
            // First, use CreateInstanceFrom to set up the AssemblyResolve handler.
            var resHelpType = typeof(AssemblyResolver);
            var resHelp     = (AssemblyResolver)defDomain.CreateInstanceFrom(resHelpType.Assembly.Location, resHelpType.FullName)
                              .Unwrap();
            resHelp.TrackResolve(resHelpType.Assembly.FullName, resHelpType.Assembly.Location);

            // Now use CreateInstance to get the domain helper of a properly loaded class.
            var type   = typeof(CallbackAccessor);
            var helper = (CallbackAccessor)defDomain.CreateInstance(type.Assembly.FullName, type.FullName).Unwrap();

            return(helper.GetCallbacks());
#else
            throw new IgniteException("Multiple domains are not supported on .NET Core.");
#endif
        }