Example #1
0
        /// <summary>
        /// Sets the source of method with given <see cref="MethodID"/>.
        /// </summary>
        /// <param name="method">The method.</param>
        /// <param name="sourceCode">The source code.</param>
        public void SetSource(MethodID method, string sourceCode)
        {
            var name = Naming.GetMethodPath(method).Name;

            ReportInvalidation(name);
            var parsedGenerator = _methods.AccordingId(method) as ParsedGenerator;

            var newGenerator = parsedGenerator.ChangeSource(sourceCode);
            var newMethod    = new MethodItem(newGenerator, newGenerator.Method);

            _methods.RemoveItem(method);
            _methods.AddItem(newMethod, TypeDescriptor.NoDescriptors);
        }
Example #2
0
        /// <summary>
        /// Register given definition into runtime assembly.
        /// </summary>
        /// <param name="definition">Registered definition.</param>
        private void buildDefinition(RuntimeTypeDefinition definition)
        {
            //every definition needs initialization
            definition.Initialize(this, this.TypeServices);

            //add static edits defined by built definition
            _globalEdits.AddRange(definition.StaticEdits);

            //every definition needs to register its chain
            createChain(definition);

            //get all methods defined by definition
            var methodGenerators = definition.GetMethods();

            foreach (var generator in methodGenerators)
            {
                var item = new MethodItem(generator, generator.MethodInfo);
                _runtimeMethods.AddItem(item, generator.Implemented);
            }

            if (definition.ComponentInfo != null)
            {
                ComponentDiscovered(definition.ComponentInfo);
            }
        }
        public SimpleAssemblyProvider(string testFileFullPath)
        {
            //uchováme cestu k "definujícímu" souboru
            _fullPath = testFileFullPath;

            //jméno assembly odvodíme od názvu souboru
            _name = Path.GetFileName(_fullPath);

            //připravíme kontejner kam vložíme definovanou metodu
            _methods = new HashedMethodContainer();

            //vytvoření metody začneme přípravou typu, kde je definovaná
            _declaringType = TypeDescriptor.Create("MEFEditor.ProviderTest");
            //určíme jméno metody
            var methodName = "GetDefiningAssemblyName";
            //návratový typ metody
            var returnType = TypeDescriptor.Create <string>();

            //z definovaných údajů můžeme vytvořit popis
            //metody, která nebude mít žádné parametry a bude statická
            var methodInfo = new TypeMethodInfo(
                _declaringType, methodName, returnType,
                ParameterTypeInfo.NoParams,
                isStatic: true,
                methodTypeArguments: TypeDescriptor.NoDescriptors);

            //k dokončení definice metody stačí vytvořit
            //generátor jejích analyzačních instrukcí
            var methodGenerator = new DirectedGenerator(emitDirector);

            //definovanou metodu vytvoříme
            var method = new MethodItem(methodGenerator, methodInfo);

            //aby byla metoda dohledatelná, musíme ji ještě zaregistrovat
            _methods.AddItem(method);
        }