mono_method_desc_search_in_image problem, and some question...

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

mono_method_desc_search_in_image problem, and some question...

pierre

    
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 Script2
{
  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  -  [hidden email]
http://lists.dot.net/mailman/listinfo/mono-list

_______________________________________________
Mono-devel-list mailing list
[hidden email]
http://lists.dot.net/mailman/listinfo/mono-devel-list
Reply | Threaded
Open this post in threaded view
|

Re: mono_method_desc_search_in_image problem, and some question...

R Zaghi
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
T: <a href="tel:+44%201223%20421311" value="+441223421311" target="_blank" style="font-size:0.8125rem;line-height:normal!important">+44 1223 421 311



On Tue, 13 Feb 2018 at 01:27, pierre <[hidden email]> 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 Script2
{
  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  -  [hidden email]
http://lists.dot.net/mailman/listinfo/mono-list
_______________________________________________
Mono-devel-list mailing list
[hidden email]
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
T: +44 1223 421 311


_______________________________________________
Mono-devel-list mailing list
[hidden email]
http://lists.dot.net/mailman/listinfo/mono-devel-list
Reply | Threaded
Open this post in threaded view
|

Re: mono_method_desc_search_in_image problem, and some question...

pierre
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
T: <a href="tel:+44%201223%20421311" value="+441223421311" target="_blank" style="font-size:0.8125rem;line-height:normal!important" moz-do-not-send="true">+44 1223 421 311



On Tue, 13 Feb 2018 at 01:27, pierre <[hidden email]> 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 Script2
{
  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  -  [hidden email]
http://lists.dot.net/mailman/listinfo/mono-list
_______________________________________________
Mono-devel-list mailing list
[hidden email]
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
T: +44 1223 421 311



_______________________________________________
Mono-devel-list mailing list
[hidden email]
http://lists.dot.net/mailman/listinfo/mono-devel-list
Reply | Threaded
Open this post in threaded view
|

Re: mono_method_desc_search_in_image problem, and some question...

R Zaghi
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:


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 <[hidden email]> 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
T: <a href="tel:+44%201223%20421311" value="+441223421311" style="font-size:0.8125rem;line-height:normal!important" target="_blank">+44 1223 421 311



On Tue, 13 Feb 2018 at 01:27, pierre <[hidden email]> 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 Script2
{
  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  -  [hidden email]
http://lists.dot.net/mailman/listinfo/mono-list
_______________________________________________
Mono-devel-list mailing list
[hidden email]
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
T: +44 1223 421 311


--



Ramin Zaghi

Mosaic3DX™ | User Interface Technology
St John's Innovation Centre,
Cowley Road,
Cambridge,
CB4 0WS, UK
T: +44 1223 421 311


_______________________________________________
Mono-devel-list mailing list
[hidden email]
http://lists.dot.net/mailman/listinfo/mono-devel-list
Reply | Threaded
Open this post in threaded view
|

Re: mono_method_desc_search_in_image problem, and some question...

R Zaghi
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 <[hidden email]> 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:


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 <[hidden email]> 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
T: <a href="tel:+44%201223%20421311" value="+441223421311" style="font-size:0.8125rem;line-height:normal!important" target="_blank">+44 1223 421 311



On Tue, 13 Feb 2018 at 01:27, pierre <[hidden email]> 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 Script2
{
  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  -  [hidden email]
http://lists.dot.net/mailman/listinfo/mono-list
_______________________________________________
Mono-devel-list mailing list
[hidden email]
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
T: +44 1223 421 311


--



Ramin Zaghi

Mosaic3DX™ | User Interface Technology
St John's Innovation Centre,
Cowley Road,
Cambridge,
CB4 0WS, UK
T: +44 1223 421 311

--



Ramin Zaghi

Mosaic3DX™ | User Interface Technology
St John's Innovation Centre,
Cowley Road,
Cambridge,
CB4 0WS, UK
T: +44 1223 421 311


_______________________________________________
Mono-devel-list mailing list
[hidden email]
http://lists.dot.net/mailman/listinfo/mono-devel-list
Reply | Threaded
Open this post in threaded view
|

Re: mono_method_desc_search_in_image problem, and some question...

pierre
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 <[hidden email]> 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:


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 <[hidden email]> 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
T: <a href="tel:+44%201223%20421311" value="+441223421311" style="font-size:0.8125rem;line-height:normal!important" target="_blank" moz-do-not-send="true">+44 1223 421 311



On Tue, 13 Feb 2018 at 01:27, pierre <[hidden email]> 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 Script2
{
  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  -  [hidden email]
http://lists.dot.net/mailman/listinfo/mono-list
_______________________________________________
Mono-devel-list mailing list
[hidden email]
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
T: +44 1223 421 311


--



Ramin Zaghi

Mosaic3DX™ | User Interface Technology
St John's Innovation Centre,
Cowley Road,
Cambridge,
CB4 0WS, UK
T: +44 1223 421 311

--



Ramin Zaghi

Mosaic3DX™ | User Interface Technology
St John's Innovation Centre,
Cowley Road,
Cambridge,
CB4 0WS, UK
T: +44 1223 421 311



_______________________________________________
Mono-devel-list mailing list
[hidden email]
http://lists.dot.net/mailman/listinfo/mono-devel-list

mono_test.zip (14K) Download Attachment