[Mono-dev] mono_method_desc_search_in_image problem, and some question...

pierre pierre.saunier at ppmodeler.com
Tue Feb 13 08:16:53 UTC 2018


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*:**rzaghi at mosaic3dx.com <mailto:rzaghi at mosaic3dx.com>
> *T*: +44 1223 421 311 <tel:+44%201223%20421311>
> http://linkedin.com/in/raminzaghi
>
>
>
> On Tue, 13 Feb 2018 at 01:27, pierre <pierre.saunier at ppmodeler.com 
> <mailto:pierre.saunier at 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-list at lists.dot.net <mailto:Mono-list at lists.dot.net>
>     http://lists.dot.net/mailman/listinfo/mono-list
>
>     _______________________________________________
>     Mono-devel-list mailing list
>     Mono-devel-list at lists.dot.net <mailto:Mono-devel-list at 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*:**rzaghi at mosaic3dx.com <mailto:rzaghi at mosaic3dx.com>
> *T*: +44 1223 421 311
> http://linkedin.com/in/raminzaghi
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.dot.net/pipermail/mono-devel-list/attachments/20180213/a94339df/attachment.html>


More information about the Mono-devel-list mailing list