/// <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); }
/// <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); }