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

R Zaghi rzaghi at mosaic3dx.com
Tue Feb 13 13:15:07 UTC 2018


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> 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> 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
>> *T*: +44 1223 421 311 <+44%201223%20421311>
>> http://linkedin.com/in/raminzaghi
>>
>>
>>
>> On Tue, 13 Feb 2018 at 01:27, pierre <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.nethttp://lists.dot.net/mailman/listinfo/mono-list
>>>
>>> _______________________________________________
>>> Mono-devel-list mailing list
>>> 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
>> *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
> *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
*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/935ee0cb/attachment-0001.html>


More information about the Mono-devel-list mailing list