[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