> I've got a situation where my application is being loaded into 2
> AppDomains, and I would like to call into one from the other
> - but I am
> not creating either one, so have no AppDomain object to work with - is
> there a way to get a reference to another AppDomain if you know it's
> name?

(...catching up...)

For security reasons, there isn't a purely managed way for code running in
one app domain to get a reference to another app domain w/o some cooperation
(or using interop to reach outside of the CLR and have a look around).  But
looking at your follow up messages, there's nothing stopping you from using
remoting to 'talk' across app domains.

The code below[1] shows a simple app that uses one app domain to host a
'server' object, and another to take on the role of client.  Just create a
console project for this code and add a reference to
System.Runtime.Remoting.Channels.dll in order to build & run.  No config
file needed.  In an add-in situation like yours, you're going to want to
avoid the use of config files to configure remoting, and just stick to API
calls.

-Mike
Bear Canyon Consulting LLC
http://www.bearcanyon.com
http://www.pluralsight.com/mike

[1]
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

class Program
{
    static void Main()
    {
        // Create 2 app domains.  One will take on the role of remoting
server,
        // the other the role of remoting client.
        //
        AppDomain serverDomain = AppDomain.CreateDomain("Server Domain");
        serverDomain.DoCallBack(InitializeServerDomain);

        AppDomain clientDomain = AppDomain.CreateDomain("Client Domain");
        clientDomain.DoCallBack(UseClientDomain);
    }

    static void InitializeServerDomain()
    {
        Console.WriteLine("InitializeServerDomain executed in app domain
'{0}'.", AppDomain.CurrentDomain.FriendlyName);

        // Connection string will be "tcp://host:999/widgetServer/widget".
        //
        ChannelServices.RegisterChannel(new TcpServerChannel(999), false);
        RemotingConfiguration.ApplicationName = "widgetServer";
        RemotingConfiguration.RegisterWellKnownServiceType(typeof(Widget),
"widget", WellKnownObjectMode.SingleCall);
    }

    static void UseClientDomain()
    {
        Console.WriteLine("UseClientDomain executed in app domain '{0}'.",
AppDomain.CurrentDomain.FriendlyName);
        Widget w = (Widget)RemotingServices.Connect(typeof(Widget),
"tcp://localhost:999/widgetServer/widget");

Console.WriteLine(w.GetMessage(AppDomain.CurrentDomain.FriendlyName));
    }
}

class Widget : MarshalByRefObject
{
    public string GetMessage(string caller)
    {
        return string.Format("Widget.GetMessage('{0}') executed in app
domain '{1}'.", caller, AppDomain.CurrentDomain.FriendlyName);
    }
}

===================================
This list is hosted by DevelopMentorĀ®  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to