แก้ไข

แชร์ผ่าน


AppDomain.DoCallBack(CrossAppDomainDelegate) Method

Definition

Executes the code in another application domain that is identified by the specified delegate.

public:
 virtual void DoCallBack(CrossAppDomainDelegate ^ callBackDelegate);
public void DoCallBack (CrossAppDomainDelegate callBackDelegate);
abstract member DoCallBack : CrossAppDomainDelegate -> unit
override this.DoCallBack : CrossAppDomainDelegate -> unit
Public Sub DoCallBack (callBackDelegate As CrossAppDomainDelegate)

Parameters

callBackDelegate
CrossAppDomainDelegate

A delegate that specifies a method to call.

Implements

Exceptions

callBackDelegate is null.

Examples

The following sample demonstrates using a static DoCallBack method.

public ref class PingPong
{
private:
    static String^ greetings = "PONG!";

public:
    static void Main()
    {
        AppDomain^ otherDomain = AppDomain::CreateDomain("otherDomain");

        greetings = "PING!";
        MyCallBack();
        otherDomain->DoCallBack(gcnew CrossAppDomainDelegate(MyCallBack));

        // Output:
        //   PING! from defaultDomain
        //   PONG! from otherDomain
    }

    static void MyCallBack()
    {
        String^ name = AppDomain::CurrentDomain->FriendlyName;

        if (name == AppDomain::CurrentDomain->SetupInformation->ApplicationName)
        {
            name = "defaultDomain";
        }
        Console::WriteLine(greetings + " from " + name);
    }
};

int main()
{
   PingPong::Main();
}
static string greetings = "PONG!";

public static void Main()
{
    AppDomain otherDomain = AppDomain.CreateDomain("otherDomain");

    greetings = "PING!";
    MyCallBack();
    otherDomain.DoCallBack(new CrossAppDomainDelegate(MyCallBack));

    // Output:
    //   PING! from defaultDomain
    //   PONG! from otherDomain
}

static public void MyCallBack()
{
    string name = AppDomain.CurrentDomain.FriendlyName;

    if (name == AppDomain.CurrentDomain.SetupInformation.ApplicationName)
    {
        name = "defaultDomain";
    }
    Console.WriteLine(greetings + " from " + name);
}
open System

let mutable greetings = "PONG!"

let myCallBack () =
    let mutable name = AppDomain.CurrentDomain.FriendlyName

    if name = AppDomain.CurrentDomain.SetupInformation.ApplicationName then
        name <- "defaultDomain"
    printfn $"{greetings} from {name}"

let otherDomain = AppDomain.CreateDomain "otherDomain"
greetings <- "PING!"
myCallBack ()
otherDomain.DoCallBack(CrossAppDomainDelegate myCallBack)

// Output:
//   PING! from defaultDomain
//   PONG! from otherDomain
Public Module PingPong

    Private greetings As String = "PONG!"

    Sub Main()
        Dim otherDomain As AppDomain = AppDomain.CreateDomain("otherDomain")

        greetings = "PING!"
        MyCallBack()
        otherDomain.DoCallBack(AddressOf MyCallBack)

        ' Output:
        '   PING! from defaultDomain
        '   PONG! from otherDomain
     End Sub

     Sub MyCallBack()
        Dim name As String = AppDomain.CurrentDomain.FriendlyName
        If name = AppDomain.CurrentDomain.SetupInformation.ApplicationName Then
            name = "defaultDomain"
        End If
        Console.WriteLine(greetings + " from " + name)
     End Sub

End Module 'PingPong

The following sample demonstrates using the DoCallBack method by value.


[Serializable]
public ref class PingPong
{
private:
    String^ greetings;

public:
    PingPong()
    {
        greetings = "PING!";
    }

    static void Main()
    {
        AppDomain^ otherDomain = AppDomain::CreateDomain("otherDomain");

        PingPong^ pp = gcnew PingPong();
        pp->MyCallBack();
        pp->greetings = "PONG!";
        otherDomain->DoCallBack(gcnew CrossAppDomainDelegate( pp, &PingPong::MyCallBack));

        // Output:
        //   PING! from defaultDomain
        //   PONG! from otherDomain
    }

    void MyCallBack()
    {
        String^ name = AppDomain::CurrentDomain->FriendlyName;

        if (name == AppDomain::CurrentDomain->SetupInformation->ApplicationName)
        {
            name = "defaultDomain";
        }
        Console::WriteLine(greetings + " from " + name);
    }
};

int main()
{
   PingPong::Main();
}
[Serializable]
public class CallbackByValSnippet
{
    private string greetings = "PING!";

    public static void Main()
    {
        AppDomain otherDomain = AppDomain.CreateDomain("otherDomain");

        CallbackByValSnippet pp = new CallbackByValSnippet();
        pp.MyCallBack();
        pp.greetings = "PONG!";
        otherDomain.DoCallBack(new CrossAppDomainDelegate(pp.MyCallBack));

        // Output:
        //   PING! from defaultDomain
        //   PONG! from otherDomain
    }

    public void MyCallBack()
    {
        string name = AppDomain.CurrentDomain.FriendlyName;

        if (name == AppDomain.CurrentDomain.SetupInformation.ApplicationName)
        {
            name = "defaultDomain";
        }
        Console.WriteLine(greetings + " from " + name);
    }
}
open System

[<Serializable>]
type PingPong() as this =
    [<DefaultValue>]
    val mutable greetings: string
    do  
        this.greetings <- "PING!"

    member _.MyCallBack() =
        let mutable name = AppDomain.CurrentDomain.FriendlyName

        if name = AppDomain.CurrentDomain.SetupInformation.ApplicationName then
            name <- "defaultDomain"
        printfn $"{this.greetings} from {name}"

let otherDomain = AppDomain.CreateDomain "otherDomain"

let pp = PingPong()
pp.MyCallBack()
pp.greetings <- "PONG!"
otherDomain.DoCallBack(CrossAppDomainDelegate pp.MyCallBack)

// Output:
//   PING! from defaultDomain
//   PONG! from otherDomain
<Serializable> _
Public Class PingPong
     Private greetings As String = "PING!"

     Public Shared Sub Main()
        Dim otherDomain As AppDomain = AppDomain.CreateDomain("otherDomain")

        Dim pp As New PingPong()
        pp.MyCallBack()
        pp.greetings = "PONG!"
        otherDomain.DoCallBack(AddressOf pp.MyCallBack)

        ' Output:
        '   PING! from defaultDomain
        '   PONG! from otherDomain
    End Sub

    Public Sub MyCallBack()
        Dim name As String = AppDomain.CurrentDomain.FriendlyName
        If name = AppDomain.CurrentDomain.SetupInformation.ApplicationName Then
            name = "defaultDomain"
        End If
        Console.WriteLine(greetings + " from " + name)
    End Sub

End Class

The following sample demonstrates using the DoCallBack method by reference.

public ref class PingPong : public MarshalByRefObject
{
private:
   String^ greetings;

public:
    PingPong()
    {
        greetings = "PING!";
    }

    static void Main()
    {
        AppDomain^ otherDomain = AppDomain::CreateDomain("otherDomain");

        PingPong^ pp = gcnew PingPong();
        pp->MyCallBack();
        pp->greetings = "PONG!";
        otherDomain->DoCallBack(gcnew CrossAppDomainDelegate( pp, &PingPong::MyCallBack));

        // Output:
        //   PING! from defaultDomain
        //   PONG! from defaultDomain
    }

    // Callback will always execute within defaultDomain due to inheritance from
    // MarshalByRefObject
    void MyCallBack()
    {
        String^ name = AppDomain::CurrentDomain->FriendlyName;
        if (name == AppDomain::CurrentDomain->SetupInformation->ApplicationName)
        {
            name = "defaultDomain";
        }
        Console::WriteLine(greetings + " from " + name);
    }
};

int main()
{
   PingPong::Main();
}
public class CallbackByRefSnippet : MarshalByRefObject
{
    private string greetings = "PING!";

    public static void Main()
    {
        AppDomain otherDomain = AppDomain.CreateDomain("otherDomain");

        CallbackByRefSnippet pp = new CallbackByRefSnippet();
        pp.MyCallBack();
        pp.greetings = "PONG!";
        otherDomain.DoCallBack(new CrossAppDomainDelegate(pp.MyCallBack));

        // Output:
        //   PING! from defaultDomain
        //   PONG! from defaultDomain
    }

    // Callback will always execute within defaultDomain due to inheritance from
    // MarshalByRefObject
    public void MyCallBack()
    {
        string name = AppDomain.CurrentDomain.FriendlyName;
        if (name == AppDomain.CurrentDomain.SetupInformation.ApplicationName)
        {
            name = "defaultDomain";
        }
        Console.WriteLine(greetings + " from " + name);
    }
}
open System
type PingPong() as this =
    inherit MarshalByRefObject()
    [<DefaultValue>]
    val mutable greetings: string
    do  
        this.greetings <- "PING!"

    // Callback will always execute within defaultDomain due to inheritance from MarshalByRefObject
    member this.MyCallBack() =
        let mutable name = AppDomain.CurrentDomain.FriendlyName
        if name = AppDomain.CurrentDomain.SetupInformation.ApplicationName then
            name <- "defaultDomain"
        printfn $"{this.greetings} from {name}"

let otherDomain = AppDomain.CreateDomain "otherDomain"

let pp = new PingPong()
pp.MyCallBack()
pp.greetings <- "PONG!"
otherDomain.DoCallBack(CrossAppDomainDelegate pp.MyCallBack)

// Output:
//   PING! from defaultDomain
//   PONG! from defaultDomain
Public Class PingPong
    Inherits MarshalByRefObject

    Private greetings As String = "PING!"
   
    Public Shared Sub Main()
        Dim otherDomain As AppDomain = AppDomain.CreateDomain("otherDomain")

        Dim pp As New PingPong()
        pp.MyCallBack()
        pp.greetings = "PONG!"
        otherDomain.DoCallBack(AddressOf pp.MyCallBack)

        ' Output:
        '   PING! from default domain
        '   PONG! from default domain
     End Sub

    ' Callback will always execute within defaultDomain due to inheritance from
    ' MarshalByRefObject
    Public Sub MyCallBack()
        Dim name As String = AppDomain.CurrentDomain.FriendlyName
        If name = AppDomain.CurrentDomain.SetupInformation.ApplicationName Then
            name = "defaultDomain"
        End If
        Console.WriteLine((greetings + " from " + name))
    End Sub

End Class

Remarks

callBackDelegate can specify a marshal-by-value, MarshalByRefObject, or ContextBoundObject.

Applies to