/// <summary>
        /// Create an adapter for a remote (out-of-process) plugin.
        /// </summary>
        /// <param name="router"></param>
        /// <param name="pluginContext"></param>
        /// <param name="descriptor"></param>
        /// <returns></returns>
        public static V8PluginAdapter CreateRemote(IV8PluginRouter router, IPluginContext pluginContext, PluginDescriptor descriptor)
        {
            V8PluginAdapter adapter;

            if (!RemotePluginAdapterCache.TryGetValue(descriptor.PluginId, out adapter))
            {
                lock (RemotePluginAdapterCache)
                {
                    if (!RemotePluginAdapterCache.TryGetValue(descriptor.PluginId, out adapter))
                    {
                        var plugin = new RemoteV8Plugin(router, pluginContext, descriptor);
                        adapter = new V8PluginAdapter(plugin);
                        RemotePluginAdapterCache.Add(descriptor.PluginId, adapter);
                    }
                }
            }

            return(adapter);
        }