Ejemplo n.º 1
0
        public void HostAdapter_Ctor()
        {
            var window = new TestWindow();
            var actual = new HostAdapter(window);

            Assert.NotNull(actual);
        }
Ejemplo n.º 2
0
        private static T AdaptToHost <T>(AddInToken pipeline, IContract addInContract)
        {
            if (addInContract == null)
            {
                throw new ArgumentNullException("addInContract");
            }
            System.Diagnostics.Contracts.Contract.EndContractBlock();

            ContractComponent contract    = pipeline._contract;
            HostAdapter       hostAdapter = pipeline._hostAdapter;

            Type hostAdapterType;
            Type contractType;

            LoadContractAndHostAdapter(contract, hostAdapter, out contractType, out hostAdapterType);

            int?temporaryToken = null;

            try
            {
                temporaryToken = addInContract.AcquireLifetimeToken();

                // This assembly resolve event exists to:
                //    1) To upgrade the contract assembly from the LoadFrom context to
                //       the default loader context
                ResolverHelper      resolver         = new ResolverHelper(pipeline);
                ResolveEventHandler assemblyResolver = new ResolveEventHandler(resolver.ResolveAssemblyForHostAdapter);
                AppDomain.CurrentDomain.AssemblyResolve += assemblyResolver;

                // Create the Host Adapter, which is a subclass of the Host Add-In View.
                // Pass the contract implementation to this constructor, using a
                // transparent proxy to the real type.  Detect common errors here.
                InvokerDelegate myInvokerDelegate = CreateConsInvoker(hostAdapterType, contractType);

                T hav;
                try
                {
                    hav = (T)myInvokerDelegate(addInContract);
                }
                catch (ArgumentException e)
                {
                    CheckForLoaderContextProblems(contract, pipeline._addinAdapter, e);
                    throw;
                }
                finally
                {
                    AppDomain.CurrentDomain.AssemblyResolve -= assemblyResolver;
                }

                return(hav);
            }
            finally
            {
                if (temporaryToken != null && addInContract != null)
                {
                    addInContract.RevokeLifetimeToken((int)temporaryToken);
                }
            }
        }
Ejemplo n.º 3
0
        public void Route_TwoSegmentsProxied_ClaimedMethodsExecuted()
        {
            var configuration = ExtensibilityConfigurationProvider.LoadConfiguration();
            var context       = new PluginContext(_strategy);
            var hostAdapter   = new HostAdapter <ISegmentedContract>(context, configuration);

            var proxy = RoutableProxy.Create <ISegmentedContract>(hostAdapter);

            Assert.Equal(ISegmentedContract.FirstSomeMethod, proxy.SomeMethod());
            Assert.Equal(ISegmentedContract.SecondSomeOtherMethod, proxy.SomeOtherMethod());
        }
Ejemplo n.º 4
0
        public void Route_XmlConfig_ClaimedMethodsExecuted()
        {
            var configuration = CreateAlphaPrimaryConfiguration();
            var context       = new PluginContext(_strategy);
            var hostAdapter   = new HostAdapter <ISegmentedContract>(context, configuration);

            var proxy = RoutableProxy.Create <ISegmentedContract>(hostAdapter);

            Assert.Equal(ISegmentedContract.FirstSomeMethod, proxy.SomeMethod());
            Assert.Equal(ISegmentedContract.SecondSomeOtherMethod, proxy.SomeOtherMethod());
        }
Ejemplo n.º 5
0
        internal PartialToken(HostAdapter hostAdapter, ContractComponent contract,
            AddInAdapter addinAdapter, AddInBase addinBase)
        {
            System.Diagnostics.Contracts.Contract.Requires(hostAdapter != null);
            System.Diagnostics.Contracts.Contract.Requires(contract != null);
            System.Diagnostics.Contracts.Contract.Requires(addinAdapter != null);
            System.Diagnostics.Contracts.Contract.Requires(addinBase != null);

            _hostAdapter = hostAdapter;
            _contract = contract;
            _addinAdapter = addinAdapter;
            _addinBase = addinBase;
        }
Ejemplo n.º 6
0
        internal PartialToken(HostAdapter hostAdapter, ContractComponent contract,
                              AddInAdapter addinAdapter, AddInBase addinBase)
        {
            System.Diagnostics.Contracts.Contract.Requires(hostAdapter != null);
            System.Diagnostics.Contracts.Contract.Requires(contract != null);
            System.Diagnostics.Contracts.Contract.Requires(addinAdapter != null);
            System.Diagnostics.Contracts.Contract.Requires(addinBase != null);

            _hostAdapter  = hostAdapter;
            _contract     = contract;
            _addinAdapter = addinAdapter;
            _addinBase    = addinBase;
        }
Ejemplo n.º 7
0
        public void Route_TwoSegments_ClaimedMethodsExecuted()
        {
            var configuration = CreateAlphaPrimaryConfiguration();
            var context       = new PluginContext(_strategy);
            var hostAdapter   = new HostAdapter <ISegmentedContract>(context, configuration);

            var firstPart = hostAdapter.Route(nameof(ISegmentedContract.SomeMethod));

            Assert.Equal(ISegmentedContract.FirstSomeMethod, firstPart.SomeMethod());

            var secondPart = hostAdapter.Route(nameof(ISegmentedContract.SomeOtherMethod));

            Assert.Equal(ISegmentedContract.SecondSomeOtherMethod, secondPart.SomeOtherMethod());
        }
Ejemplo n.º 8
0
        internal static T ActivateHostAdapter <T>(PartialToken pipeline, IContract addIn)
        {
            if (pipeline == null)
            {
                throw new ArgumentNullException("pipeline");
            }
            if (addIn == null)
            {
                throw new ArgumentNullException("addIn");
            }
            System.Diagnostics.Contracts.Contract.EndContractBlock();

            ContractComponent contract    = pipeline._contract;
            HostAdapter       hostAdapter = pipeline._hostAdapter;

            Type hostAdapterType;
            Type contractType;

            LoadContractAndHostAdapter(contract, hostAdapter, out contractType, out hostAdapterType);

            // This assembly resolve event exists to:
            //    1) To upgrade the contract assembly from the LoadFrom context to
            //       the default loader context
            ResolverHelper      resolver         = new ResolverHelper(contract);
            ResolveEventHandler assemblyResolver = new ResolveEventHandler(resolver.ResolveAssemblyForHostAdapter);

            AppDomain.CurrentDomain.AssemblyResolve += assemblyResolver;

            T hav;

            InvokerDelegate myInvokerDelegate = CreateConsInvoker(hostAdapterType, contractType);

            try
            {
                hav = (T)myInvokerDelegate(addIn);
            }
            catch (ArgumentException e)
            {
                CheckForLoaderContextProblems(contract, pipeline._addinAdapter, e);
                throw;
            }
            finally
            {
                AppDomain.CurrentDomain.AssemblyResolve -= assemblyResolver;
            }

            return(hav);
        }
Ejemplo n.º 9
0
        internal static void LoadContractAndHostAdapter(ContractComponent contract, HostAdapter hostAdapter,
                                                        out Type contractType, out Type hostAdapterType)
        {
            PermissionSet assertSet = new PermissionSet(PermissionState.None);

            assertSet.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read | FileIOPermissionAccess.PathDiscovery, hostAdapter.Location));
            assertSet.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read | FileIOPermissionAccess.PathDiscovery, contract.Location));
            assertSet.Assert();

            // Explicitly load the host adapter & contract first, using LoadFrom
            // to ensure they are loaded in the same loader context.
            Assembly hostAdapterAssembly = Assembly.LoadFrom(hostAdapter.Location);
            Assembly contractAssembly    = Assembly.LoadFrom(contract.Location);

            hostAdapterType = hostAdapterAssembly.GetType(hostAdapter.TypeInfo.FullName, true);
            contractType    = contractAssembly.GetType(contract.TypeInfo.FullName, true);
        }
Ejemplo n.º 10
0
        public void Route_JsonConfig_ClaimedMethodsExecuted()
        {
            var builder = new ConfigurationBuilder()
                          .SetBasePath(Directory.GetCurrentDirectory())
                          .AddJsonFile("test.json");

            var configurationRoot = builder.Build();

            var configuration = configurationRoot.Get <ExtensibilityConfiguration>();
            var context       = new PluginContext(_strategy);
            var hostAdapter   = new HostAdapter <ISegmentedContract>(context, configuration);

            var proxy = RoutableProxy.Create <ISegmentedContract>(hostAdapter);

            Assert.Equal(ISegmentedContract.FirstSomeMethod, proxy.SomeMethod());
            Assert.Equal(ISegmentedContract.SecondSomeOtherMethod, proxy.SomeOtherMethod());
        }
        internal AddInToken(HostAdapter hostAdapter, ContractComponent contract,
                            AddInAdapter addinAdapter, AddInBase addinBase, AddIn addin)
        {
            System.Diagnostics.Contracts.Contract.Requires(hostAdapter != null);
            System.Diagnostics.Contracts.Contract.Requires(contract != null);
            System.Diagnostics.Contracts.Contract.Requires(addinAdapter != null);
            System.Diagnostics.Contracts.Contract.Requires(addinBase != null);
            System.Diagnostics.Contracts.Contract.Requires(addin != null);

            _hostAddinViews = hostAdapter.HostAddinViews;
            _hostAdapter    = hostAdapter;
            _contract       = contract;
            _addinAdapter   = addinAdapter;
            _addinBase      = addinBase;
            _addin          = addin;

            // _pipelineRootDir must be filled in after deserialization.
        }
 protected override void Act()
 {
     HostAdapter.NavigateTask(validationError);
 }
Ejemplo n.º 13
0
        private static T ActivateInAppDomain <T>(AddInToken pipeline, AppDomain domain, AddInControllerImpl controller, bool weOwn)
        {
            ContractComponent contract    = pipeline._contract;
            HostAdapter       hostAdapter = pipeline._hostAdapter;

            bool usingHostAppDomain = domain == AppDomain.CurrentDomain;

            //begin direct connect code
            if (AddInToken.EnableDirectConnect && !weOwn && usingHostAppDomain)
            {
                Type     havType     = typeof(T);
                TypeInfo havTypeInfo = new TypeInfo(havType);

                if (pipeline._addinBase.CanDirectConnectTo(havTypeInfo))
                {
                    // Connect directly for best performance.
                    // Assert permission to the specific Addin directory only.
                    PermissionSet permissionSet = new PermissionSet(PermissionState.None);
                    permissionSet.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read | FileIOPermissionAccess.PathDiscovery,
                                                                     Path.GetDirectoryName(pipeline._addin.Location)));
                    permissionSet.Assert();

                    Assembly addInAssembly = Assembly.LoadFrom(pipeline._addin.Location);
                    //
                    Type   addinType = addInAssembly.GetType(pipeline._addin.TypeInfo.FullName, true);
                    Object addIn     = addinType.GetConstructor(new Type[0]).Invoke(new Object[0]);
                    System.Diagnostics.Contracts.Contract.Assert(addIn != null, "Bypass couldn't create the add-in");

                    // remember the addin directly as the HAV.  Set the contract to null.
                    controller.AssociateWithHostAddinView(addIn, null);

                    return((T)addIn);
                }
            }
            //end direct connect code

            // Use Activator.CreateInstance instead of AppDomain.CreateInstanceAndUnwrap
            // because Activator will do the appropriate security asserts in the
            // remote appdomain.
            Type t = typeof(ActivationWorker);

            Object[]     args      = new Object[] { pipeline };
            ObjectHandle objHandle = Activator.CreateInstance(domain, t.Assembly.FullName, t.FullName,
                                                              false, BindingFlags.Instance | BindingFlags.NonPublic, null,
                                                              args, null, null);
            ActivationWorker activationWorker = (ActivationWorker)objHandle.Unwrap();

            activationWorker.UsingHostAppDomain = usingHostAppDomain;

            System.AddIn.Contract.IContract addInContract = null;
            try
            {
                addInContract = activationWorker.Activate();
            }
            catch (Exception ex)
            {
                CheckForDuplicateAssemblyProblems(pipeline, ex);
                throw;
            }

            if (weOwn)
            {
                domain.SetData(ContractHandle.s_appDomainOwner, addInContract);
            }

            controller.ActivationWorker = activationWorker;
            T hav = AdaptToHost <T>(pipeline, addInContract);

            controller.AssociateWithHostAddinView(hav, addInContract);

            return(hav);
        }