If this is actually a problem with a library like mono then it sounds like a caching problem. If you build mono from source then it's easier to look into this...
Compare your code with this example. In the example, the .dll assembly is re-loaded in a loop. You can see the clean up portion and the shutdown or initialisation portions too: https://github.com/ramin-zaghi/mono-embedding Regarding how to compile code at runtime without a system() call, you can use CodeDom (look it up) to compile from files, or in a mono-specific way use Mono Compiler Service (e.g the Evaluator and CompilerContext classes - google them) which allow you to evaluate partial expressions/statements/etc. I use both depending on situation and they work pretty well. Roslyn is apparently another option but let's not go there :) R. On Tue, 13 Feb 2018 at 16:17, pierre <pierre.saun...@ppmodeler.com> wrote: > Thanks for the answer. > > > > you 100% sure the old files are all overwritten? > Yes, I have checked the file time... and also included a > > remove(fileName); > > to be sure! > > > >There are a couple of different ways to get compiled binary at runtime > without a system() call > Which ones? > > I have tried something: > calling mono_image_open_from_data_with_name and mono_assembly_load_from_full > with a different file name on every compile and it is working!!! > > so, the following code is not reloading properly: > > monoEngine->fileName = strdup("code.dll"); > > > monoEngine->image = mono_image_open_from_data_with_name(data, dataLen, > TRUE /* copy > data */, > &status, > FALSE /* ref > only */, > > monoEngine->fileName); > if (status != MONO_IMAGE_OK || monoEngine->image == NULL) > { > } > monoEngine->assembly = mono_assembly_load_from_full(monoEngine->image, > > monoEngine->fileName, > &status, FALSE); > if (status != MONO_IMAGE_OK || monoEngine->assembly == NULL) > { > } > > > but, the same with a different file name on every run (only the > monoEngine->fileName creation differ) is working: > > static int version = 1; > ... > > sprintf(monoEngine->fileName, "code%03d.dll", version); > version ++; > > > monoEngine->image = mono_image_open_from_data_with_name(data, dataLen, > TRUE /* copy > data */, > &status, > FALSE /* ref > only */, > > monoEngine->fileName); > if (status != MONO_IMAGE_OK || monoEngine->image == NULL) > { > } > monoEngine->assembly = mono_assembly_load_from_full(monoEngine->image, > > monoEngine->fileName, > &status, FALSE); > if (status != MONO_IMAGE_OK || monoEngine->assembly == NULL) > { > } > > Is there a wait to be introduced after a mono_domain_unload? It is like > doing mono_domain_unload, mono_image_open_from_data_with_name and > mono_assembly_load_from_full > with the same file name is detected and the unload is not performed.... > > > > This is more likely to be a problem outside of mono. > I do agree... but I am running out of idea on why!!! > > > and for mono_method_desc_search_in_image? is it bug? > > > Pierre > > > On 13/02/2018 07:15, R Zaghi wrote: > > I think we need to know a bit more about what you are doing in the code > exactly but as a quick first guess if you are recompiling using a system() > call then are you 100% sure the old files are all overwritten? There are a > couple of different ways to get compiled binary at runtime without a > system() call which I prefer but if you are using a system() call then have > you tried two separate calls with two parallel binaries loaded as a start > to debug your code? > > This is more likely to be a problem outside of mono. > > Ramin > > > > > Ramin Zaghi > > *Mosaic3DX™ | User Interface Technology* > St John's Innovation Centre, > Cowley Road, > Cambridge, > CB4 0WS, UK > *E*: rza...@mosaic3dx.com > *T*: +44 1223 421 311 <+44%201223%20421311> > http://linkedin.com/in/raminzaghi > > > > On Tue, 13 Feb 2018 at 01:27, pierre <pierre.saun...@ppmodeler.com> wrote: > >> Hi, >> >> I am trying to embed mono... and I ran into a problem with the code: >> >> monoMethodDesc = mono_method_desc_new("Script:Main", 0); >> method = mono_method_desc_search_in_image(monoMethodDesc, >> monoEngine->image); >> >> >> It is returning a method on the cs code: >> >> public class Script >> { >> static public void Main () >> { >> ScriptEngine.report("--Main Called "); >> } >> } >> >> >> but it is also returning a method on the cs code (with the wrong class >> name): >> >> public class Script*2* >> { >> static public void Main () >> { >> ScriptEngine.report("--Main Called "); >> } >> } >> >> while it should only return for: >> >> monoMethodDesc = mono_method_desc_new("Script2:Main", 0); >> >> >> Am i doing something wrong or is this a bug? It seem that >> mono_method_desc_search_in_image >> is returning a value if the actual class name is starting with the given >> class name.... so, the same method is returned if I look for "Script:Main" >> but the declared class is "Script:Main", "Script_test:Main" or >> "Script2:Main"... >> >> and a question: >> is there a way to know if mono_domain_unload was successful or not? >> >> I am creating an app domain per script so that I can recompile and reload >> the script at will... >> I do not detect any error, but the new script seems not to replace the >> old one... >> Basically, I am doing: >> >> res = mono_domain_set(rootDomain, FALSE); >> mono_domain_unload(monoEngine->domain); >> monoEngine->domain = mono_domain_create_appdomain("ScriptEngine-sub", >> NULL); >> >> data = readFile(f, &dataLen); >> fclose(f); >> monoEngine->image = mono_image_open_from_data_with_name(data, dataLen, >> TRUE /* copy >> data */, >> &status, >> FALSE /* ref >> only */, >> >> monoEngine->fileName); >> free(data); >> if (status != MONO_IMAGE_OK || monoEngine->image == NULL) >> { >> return FALSE; >> } >> >> // load the assembly >> monoEngine->assembly = mono_assembly_load_from_full(monoEngine->image, >> >> monoEngine->fileName, >> &status, FALSE); >> if (status != MONO_IMAGE_OK || monoEngine->assembly == NULL) >> { >> mono_image_close(monoEngine->image); >> return FALSE; >> } >> >> but it does not seem to work. The code that runs is always the first >> loaded one!! >> >> I also added the following code to my engine: >> >> mono_trace_set_log_handler(monoLogCallback, NULL); >> mono_trace_set_print_handler(monoPrintCallback); >> mono_trace_set_printerr_handler(monoPrintCallback); >> mono_trace_set_level_string ("debug"); >> >> >> but it is reporting debug info only on the first run... is there a way to >> having it working on every run? >> >> Lastly, Is there a way to compile cs source without launching a >> >> system("msc.code.cs -target:library"); >> >> thanks in advance >> >> Pierre >> >> >> >> _______________________________________________ >> Mono-list maillist - >> mono-l...@lists.dot.nethttp://lists.dot.net/mailman/listinfo/mono-list >> >> _______________________________________________ >> Mono-devel-list mailing list >> Mono-devel-list@lists.dot.net >> http://lists.dot.net/mailman/listinfo/mono-devel-list >> > -- > > > > Ramin Zaghi > > *Mosaic3DX™ | User Interface Technology* > St John's Innovation Centre, > Cowley Road, > Cambridge, > CB4 0WS, UK > *E*: rza...@mosaic3dx.com > *T*: +44 1223 421 311 > http://linkedin.com/in/raminzaghi > > > -- Ramin Zaghi *Mosaic3DX™ | User Interface Technology* St John's Innovation Centre, Cowley Road, Cambridge, CB4 0WS, UK *E*: rza...@mosaic3dx.com *T*: +44 1223 421 311 http://linkedin.com/in/raminzaghi
_______________________________________________ Mono-devel-list mailing list Mono-devel-list@lists.dot.net http://lists.dot.net/mailman/listinfo/mono-devel-list