Environment
Reflection Desktop (including Pro, for IBM or for UNIX and OpenVMS) 16.0 or higher
Situation
When opening multiple Reflection Desktop Host sessions with the .NET API, all the host sessions open in the same Workspace, instead of individual Reflection Workspaces as expected. A .NET API application has been written in C#, which
uses unique IPC Channel names for launching multiple Reflection “Frames” and opening a
Host session in each one. When using this
methodology, the unique IPC channel names should cause each Host session to
open in its own Reflection Workspace.
With Reflection Desktop 16.1 (and Reflection Desktop 16.1 SP1) this
occurs, each host session launched ends up in its own Workspace. Starting with Reflection Desktop 16.2 (all the way through Reflection
Desktop 16.2 Update 4) instead of this happening, each host session launched
ends up in the same Workspace, which can cause problems when individual Host sessions are opened and closed.
Resolution
To work-around this issue with Reflection Desktop 16.2 and higher, call MyReflection.Start() before calling MyReflection.CreateApplication() which will create separate Workspaces whether the IPC channels are the same
or different:
Existing code which fails:
Int ran = rnd.Next(1,10000);Attachmate.Reflection.Framework.Application reflectionApplication = MyReflection.CreateApplication("myWorkspace" + ran.ToString(), true);
Updated code which will resolve the issue:
Int ran = rnd.Next(1,10000);
MyReflection.Start(("myWorkspace" + ran.ToString())
Attachmate.Reflection.Framework.Application reflectionApplication = MyReflection.CreateApplication("myWorkspace" + ran.ToString(),true);
This issue will be resolved in Reflection Desktop 17.0 and higher and will no longer require the workaround. But if the MyReflection.Start() method has already been added to the code, this will still work correctly in future releases of Reflection Desktop.
Additional Information
Modifying the Reflection Workspace setting for “Open documents in same workspace” as both checked and unchecked, will not make a difference to this problem.
Here is the source code for a test application to duplicate the issue:
using System;
using Attachmate.Reflection.Emulation.OpenSystems;
using Attachmate.Reflection.Framework;
using Attachmate.Reflection.UserInterface;
class RDtest
{
using Attachmate.Reflection.Emulation.OpenSystems;
using Attachmate.Reflection.Framework;
using Attachmate.Reflection.UserInterface;
class RDtest
{
public static void Main(String[] args)
{
String settingsA = @args[0];
String settingsB = @args[1];
String ipcChannelA = args[2];
String ipcChannelB = args[3];
Boolean isVisible = true;
Console.WriteLine("Launching first instance of Reflection ...");
{
String settingsA = @args[0];
String settingsB = @args[1];
String ipcChannelA = args[2];
String ipcChannelB = args[3];
Boolean isVisible = true;
Console.WriteLine("Launching first instance of Reflection ...");
// Uncomment the following line to make this sample application work properly
//MyReflection.Start(ipcChannelA);
Application appA = MyReflection.CreateApplication(ipcChannelA, isVisible);
IFrame frameA = (IFrame)appA.GetObject("Frame");
ITerminal terminalA = appA.CreateControl(settingsA) as ITerminal;
frameA.CreateView(terminalA);
Console.WriteLine("Launching second instance of Reflection ...");
//MyReflection.Start(ipcChannelA);
Application appA = MyReflection.CreateApplication(ipcChannelA, isVisible);
IFrame frameA = (IFrame)appA.GetObject("Frame");
ITerminal terminalA = appA.CreateControl(settingsA) as ITerminal;
frameA.CreateView(terminalA);
Console.WriteLine("Launching second instance of Reflection ...");
// Uncomment the following line to make this sample application work properly
//MyReflection.Start(ipcChannelB);
Application appB = MyReflection.CreateApplication(ipcChannelB, isVisible);
IFrame frameB = (IFrame)appB.GetObject("Frame");
ITerminal terminalB = appB.CreateControl(settingsB) as ITerminal;
frameB.CreateView(terminalB);
Console.WriteLine("Testing the .NET API with each session");
terminalA.Screen.DisplayText("Session: " + settingsA + "\r\nChannel: " + ipcChannelA);
terminalB.Screen.DisplayText("Session: " + settingsB + "\r\nChannel: " + ipcChannelB);
}
}
//MyReflection.Start(ipcChannelB);
Application appB = MyReflection.CreateApplication(ipcChannelB, isVisible);
IFrame frameB = (IFrame)appB.GetObject("Frame");
ITerminal terminalB = appB.CreateControl(settingsB) as ITerminal;
frameB.CreateView(terminalB);
Console.WriteLine("Testing the .NET API with each session");
terminalA.Screen.DisplayText("Session: " + settingsA + "\r\nChannel: " + ipcChannelA);
terminalB.Screen.DisplayText("Session: " + settingsB + "\r\nChannel: " + ipcChannelB);
}
}