Это можно сделать, просто создав объект MarshalByRef в отдельном домене приложения, а затем вызвав метод для этого объекта.
Возьмем, к примеру, следующее определение класса.
public interface IFoo
{
void SomeMethod();
}
public class Foo : MarshalByRefObject, IFoo
{
public Foo()
{
}
public void SomeMethod()
{
Console.WriteLine("In Other AppDomain");
}
}
Затем вы можете использовать это определение для вызова отдельного домена приложений из текущего. В момент, когда вызов записывается в консоль, у вас будет 1 поток в 2 доменах приложений (в 2 разных точках в стеке вызовов). Вот пример кода для этого.
public static void CallIntoOtherAppDomain()
{
var domain = AppDomain.CreateDomain("Other Domain");
var obj = domain.CreateInstanceAndUnwrap(typeof(Foo).Assembly.FullName, typeof(Foo).FullName);
var foo = (IFoo)obj;
foo.SomeMethod();
}