Hi John,
I know what your problem is. I also hit this when I was migrating from previous
versions of J to the latest version.
You see, there was a significant change in how J behaves during JEXEServer
startup. (me checking my production code right now).
There should be a voice over that said, "a few minutes later" ... heheheeh.
Well, after reviewing my code, the significant change is that the new J602
requires that you initialize a dummy window in J. So my production code does
the following:
//-->> START OF C# Code <<
/// <summary>
/// Actual method that initializes the session
/// </summary>
private void initialize()
{
string jScript = @"
BINPATH_z_=: 1!:46''
ARGV_z_=: ,<'Session Server'
";
// Create a new copy of the J Object and make sure were in the Z
locale
jObject = new JEXEServerClass();
jObject.Quit();
// If were debugging, we need to add the debugging script
if (this.debug)
{
// Add the profile load command
jScript += @"
0!:0 <BINPATH,'\\profile.ijs'
wd 'pn *Session Server'
";
// Setup the J Session to log and show the J Window
jObject.Log(1);
jObject.Show(1);
}
else
{
// Since were not loading a profile, we need to create a hidden
form
jObject.Do("11!:0'pc Session;cc e editijx;'");
jObject.Log(0);
jObject.Show(0);
}
// Now get the base EOE Script
jScript += UnicodeEncoding.ASCII.GetString(Resources.eoeBaseScript);
// Load the new script to the current session
this.Variable("loadScript", jScript);
// string temp = (string)this.Variable("loadScript");
// Now we execute the values in the loadScript Variable
this.Eval("0!:0 loadScript");
}
//--->> END OF CODE <<
If you would review, the code does the following:
1. The code make sure that the following global variables are properly
initialized:
BINPATH_z_=: 1!:46''
ARGV_z_=: ,<'Session Server'
2. Initializes the JEXEServerClass and make sure that the instance will quit
when the calling application does:
jObject = new JEXEServerClass();
jObject.Quit();
3. Depending if you want to display a J form, you'll have to do either one of
the following options:
3a. If you want to display a J form, it is recommended that you
initialize it with your profile:
// Add the profile load command
jScript += @"
0!:0 <BINPATH,'\\profile.ijs'
wd 'pn *Session Server'
";
// Setup the J Session to log and show the J Window
jObject.Log(1);
jObject.Show(1);
3b. You don't need a J form so you just initialize a HIDDEN form so J
won't crash
// Since were not loading a profile, we need to create a hidden
form
jObject.Do("11!:0'pc Session;cc e editijx;'");
jObject.Log(0);
jObject.Show(0);
So to go back and answer your questions one by one:
> 1) The JEXEServer never appears despite being requested with a Show(1)
- Show(1) does not display the form. You need to create a form and display it
through script using the wd command.
> 2) The Quit() does not shutdown the J server
- Qui() only signifies that the session closes when the calling application
quits. If you don't do this, you'll technically have a memory leak. :P
> 3) Exiting the C# app leads to an invalid memory reference in J. Probably
> related to not shutting down properly.
- This is "feature" with the new J602. Its seems that since you did not create
a window during your session startup, J is trying to close an invalid window
handle hence the crash. :)
Hope this helps.
r/Alex
P.S.
I'm using MS-Outlook 2007 ... beware of auto line break formatting. :P
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of John Baker
Sent: Wednesday, August 12, 2009 7:08 AM
To: Programming forum
Subject: [Jprogramming] C# and JEXEServer
During the last few days I have been trying to control a JEXEServer from
C#. I have downloaded, studied
and compiled Alex Rufon's example on the J wiki but I cannot get it to
behave.
I am using the free Visual C# Express edition. I don't believe there are
any C# version specific issues but I could
be wrong. The following snippet is just about the simplest possible use of
a JEXEServer
private void button1_Click(object sender, EventArgs e)
{
object jout;
string jstr;
JEXEServerLib.JEXEServer jObject = new JEXEServerLib.JEXEServer();
jObject.Log(1);
jObject.Show(1);
jObject.Do("jRes=. 'string from J'");
jObject.GetB("jRes", out jout);
jstr = (string) jout;
textBox.Text = jstr;
jObject.Quit();
jObject = null;
}
This almost works with the following exceptions:
1) The JEXEServer never appears despite being requested with a Show(1)
2) The Quit() does not shutdown the J server
3) Exiting the C# app leads to an invalid memory reference in J. Probably
related to not shutting down properly.
I can see J executing as j.exe shows in the process list and I can send and
receive data from the server. I have used similiar code in VB for years and
I judge people (Alex) have managed this from C# as well. Has anyone tried
this recently in any of the Express compilers.
--
John D. Baker
[email protected]
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm