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

pierre pierre.saunier at ppmodeler.com
Tue Feb 13 17:22:19 UTC 2018


Here a sample in one (dirty) c file...
the file can be compiled easily, just adding the mono library and the 
mono include path.

the core is doing:

       monoScriptCompile("code1", "code.dll");
       monoScriptRun();
       monoScriptCompile("code2", "code.dll");
       monoScriptRun();
       monoScriptCompile("code2", "code2.dll");
       monoScriptRun();

And the result on my system is:

    Starting
    Assembly Name: code1, Version=0.0.0.0, Culture=neutral,
    PublicKeyToken=null
    Code 1
    Assembly Name: code1, Version=0.0.0.0, Culture=neutral,
    PublicKeyToken=null
    *Code 1*
    Assembly Name: code2, Version=0.0.0.0, Culture=neutral,
    PublicKeyToken=null
    Code 2

and as you can see, the code is not reloaded properly when the reference 
is kept, but reloaded in the second case!!!


On 13/02/2018 14:15, R Zaghi wrote:
> Just for the record, I mean write it in a C# class and load that one 
> class so you can handle everything in C# itself - much more robust.
>
>
> On Tue, 13 Feb 2018 at 19:04, R Zaghi <rzaghi at mosaic3dx.com 
> <mailto:rzaghi at mosaic3dx.com>> wrote:
>
>     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.saunier at ppmodeler.com
>     <mailto:pierre.saunier at 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*:**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
>>
>
>     -- 
>
>
>
>     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
>
> -- 
>
>
>
> 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/866b2e45/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: mono_test.zip
Type: application/octet-stream
Size: 10814 bytes
Desc: not available
URL: <http://lists.dot.net/pipermail/mono-devel-list/attachments/20180213/866b2e45/attachment-0001.obj>


More information about the Mono-devel-list mailing list