MarshalByRefObject Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Ermöglicht den Zugriff auf Objekte über Anwendungsdomänengrenzen hinweg in Anwendungen, die Remoting unterstützen.
public ref class MarshalByRefObject abstract
public abstract class MarshalByRefObject
[System.Serializable]
public abstract class MarshalByRefObject
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class MarshalByRefObject
type MarshalByRefObject = class
[<System.Serializable>]
type MarshalByRefObject = class
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type MarshalByRefObject = class
Public MustInherit Class MarshalByRefObject
- Vererbung
-
MarshalByRefObject
- Abgeleitet
- Attribute
Beispiele
Dieser Abschnitt enthält zwei Codebeispiele. Das erste Codebeispiel zeigt, wie eine Instanz einer Klasse in einer anderen Anwendungsdomäne erstellt wird. Das zweite Codebeispiel zeigt eine einfache Klasse, die für Remoting verwendet werden kann.
Beispiel 1
Das folgende Codebeispiel zeigt die einfachste Methode zum Ausführen von Code in einer anderen Anwendungsdomäne. Im Beispiel wird eine Klasse mit dem Namen Worker definiert, die erbt MarshalByRefObject, mit einer Methode, die den Namen der Anwendungsdomäne anzeigt, in der sie ausgeführt wird. Im Beispiel werden Instanzen von Worker in der Standardanwendungsdomäne und in einer neuen Anwendungsdomäne erstellt.
Note
Die assembly, die enthält Worker , muss in beide Anwendungsdomänen geladen werden, kann jedoch andere Assemblys laden, die nur in der neuen Anwendungsdomäne vorhanden wären.
using namespace System;
using namespace System::Reflection;
public ref class Worker : MarshalByRefObject
{
public:
void PrintDomain()
{
Console::WriteLine("Object is executing in AppDomain \"{0}\"",
AppDomain::CurrentDomain->FriendlyName);
}
};
void main()
{
// Create an ordinary instance in the current AppDomain
Worker^ localWorker = gcnew Worker();
localWorker->PrintDomain();
// Create a new application domain, create an instance
// of Worker in the application domain, and execute code
// there.
AppDomain^ ad = AppDomain::CreateDomain("New domain");
Worker^ remoteWorker = (Worker^) ad->CreateInstanceAndUnwrap(
Worker::typeid->Assembly->FullName,
"Worker");
remoteWorker->PrintDomain();
}
/* This code produces output similar to the following:
Object is executing in AppDomain "source.exe"
Object is executing in AppDomain "New domain"
*/
using System;
using System.Reflection;
public class CreateInstanceWorker : MarshalByRefObject
{
public void PrintDomain()
{
Console.WriteLine("Object is executing in AppDomain \"{0}\"",
AppDomain.CurrentDomain.FriendlyName);
}
}
class CreateInstanceAndUnwrapSourceSnippet
{
public static void Main()
{
// Create an ordinary instance in the current AppDomain
CreateInstanceWorker localWorker = new CreateInstanceWorker();
localWorker.PrintDomain();
// Create a new application domain, create an instance
// of Worker in the application domain, and execute code
// there.
AppDomain ad = AppDomain.CreateDomain("New domain");
CreateInstanceWorker remoteWorker = (CreateInstanceWorker) ad.CreateInstanceAndUnwrap(
typeof(CreateInstanceWorker).Assembly.FullName,
"Worker");
remoteWorker.PrintDomain();
}
}
/* This code produces output similar to the following:
Object is executing in AppDomain "source.exe"
Object is executing in AppDomain "New domain"
*/
open System
open System.Reflection
type Worker() =
inherit MarshalByRefObject()
member _.PrintDomain() =
printfn $"Object is executing in AppDomain \"{AppDomain.CurrentDomain.FriendlyName}\""
// Create an ordinary instance in the current AppDomain
let localWorker = Worker()
localWorker.PrintDomain()
// Create a new application domain, create an instance
// of Worker in the application domain, and execute code
// there.
let ad = AppDomain.CreateDomain "New domain"
let remoteWorker =
ad.CreateInstanceAndUnwrap(typeof<Worker>.Assembly.FullName, "Worker") :?> Worker
remoteWorker.PrintDomain()
// This code produces output similar to the following:
// Object is executing in AppDomain "source.exe"
// Object is executing in AppDomain "New domain"
Imports System.Reflection
Public Class Worker
Inherits MarshalByRefObject
Public Sub PrintDomain()
Console.WriteLine("Object is executing in AppDomain ""{0}""", _
AppDomain.CurrentDomain.FriendlyName)
End Sub
End Class
Class Example
Public Shared Sub Main()
' Create an ordinary instance in the current AppDomain
Dim localWorker As New Worker()
localWorker.PrintDomain()
' Create a new application domain, create an instance
' of Worker in the application domain, and execute code
' there.
Dim ad As AppDomain = AppDomain.CreateDomain("New domain")
Dim remoteWorker As Worker = CType( _
ad.CreateInstanceAndUnwrap( _
GetType(Worker).Assembly.FullName, _
"Worker"), _
Worker)
remoteWorker.PrintDomain()
End Sub
End Class
' This code produces output similar to the following:
'
'Object is executing in AppDomain "source.exe"
'Object is executing in AppDomain "New domain"
Beispiel 2
Im folgenden Beispiel wird eine Klasse veranschaulicht, die von MarshalByRefObject der späteren Verwendung im Remoting abgeleitet wird.
using namespace System;
using namespace System::Runtime::Remoting;
using namespace System::Security::Permissions;
public ref class SetObjectUriForMarshalTest
{
public:
ref class TestClass: public MarshalByRefObject{};
[SecurityPermissionAttribute(SecurityAction::Demand, Flags=SecurityPermissionFlag::RemotingConfiguration)]
static void Main()
{
TestClass^ obj = gcnew TestClass;
RemotingServices::SetObjectUriForMarshal( obj, "testUri" );
RemotingServices::Marshal(obj);
Console::WriteLine( RemotingServices::GetObjectUri( obj ) );
}
};
using System;
using System.Runtime.Remoting;
public class SetObjectUriForMarshalTest {
class TestClass : MarshalByRefObject {
}
public static void Main() {
TestClass obj = new TestClass();
RemotingServices.SetObjectUriForMarshal(obj, "testUri");
RemotingServices.Marshal(obj);
Console.WriteLine(RemotingServices.GetObjectUri(obj));
}
}
open System
open System.Runtime.Remoting
open System.Security.Permissions
type TestClass() =
inherit MarshalByRefObject()
[<EntryPoint>]
let main _ =
let obj = TestClass()
RemotingServices.SetObjectUriForMarshal(obj, "testUri")
RemotingServices.Marshal obj |> ignore
printfn $"{RemotingServices.GetObjectUri obj}"
0
Imports System.Runtime.Remoting
Imports System.Security.Permissions
Public Class SetObjectUriForMarshalTest
Class TestClass
Inherits MarshalByRefObject
End Class
<SecurityPermission(SecurityAction.Demand, Flags:= SecurityPermissionFlag.RemotingConfiguration )> _
Public Shared Sub Main()
Dim obj As TestClass = New TestClass()
RemotingServices.SetObjectUriForMarshal(obj, "testUri")
RemotingServices.Marshal(obj)
Console.WriteLine(RemotingServices.GetObjectUri(obj))
End Sub
End Class
Hinweise
Eine Anwendungsdomäne ist eine Partition in einem Betriebssystemprozess, in dem sich eine oder mehrere Anwendungen befinden. Objekte in derselben Anwendungsdomäne kommunizieren direkt. Objekte in unterschiedlichen Anwendungsdomänen kommunizieren entweder durch das Transport von Kopien von Objekten über Anwendungsdomänengrenzen hinweg oder mithilfe eines Proxys zum Austauschen von Nachrichten.
MarshalByRefObject ist die Basisklasse für Objekte, die über Anwendungsdomänengrenzen hinweg kommunizieren, indem Nachrichten mithilfe eines Proxys ausgetauscht werden. Objekte, die MarshalByRefObject nicht erben, werden implizit nach Wert marshallen. Wenn eine Remoteanwendung auf ein Marshal by Value-Objekt verweist, wird eine Kopie des Objekts über Anwendungsdomänengrenzen hinweg übergeben.
MarshalByRefObject Auf Objekte wird direkt innerhalb der Grenzen der lokalen Anwendungsdomäne zugegriffen. Wenn eine Anwendung in einer Remoteanwendungsdomäne zum ersten Mal auf eine MarshalByRefObjectAnwendung zugreift, wird ein Proxy an die Remoteanwendung übergeben. Nachfolgende Aufrufe des Proxys werden zurück an das Objekt gemarstet, das sich in der lokalen Anwendungsdomäne befindet.
Typen müssen erben MarshalByRefObject , wenn der Typ über Anwendungsdomänengrenzen hinweg verwendet wird, und der Status des Objekts darf nicht kopiert werden, da die Elemente des Objekts nicht außerhalb der Anwendungsdomäne verwendet werden können, in der sie erstellt wurden.
Wenn Sie ein Objekt für MarshalByRefObject die Verwendung über Anwendungsdomänengrenzen ableiten, sollten Sie keine seiner Member außer Kraft setzen, oder sie sollten die Methoden nicht direkt aufrufen. Die Laufzeit erkennt, dass abgeleitete MarshalByRefObject Klassen über App-Domänengrenzen hinweg gemarstet werden sollen.
Konstruktoren
| Name | Beschreibung |
|---|---|
| MarshalByRefObject() |
Initialisiert eine neue Instanz der MarshalByRefObject-Klasse. |
Methoden
| Name | Beschreibung |
|---|---|
| CreateObjRef(Type) |
Erstellt ein Objekt, das alle relevanten Informationen enthält, die zum Generieren eines Proxys erforderlich sind, der für die Kommunikation mit einem Remoteobjekt verwendet wird. |
| Equals(Object) |
Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht. (Geerbt von Object) |
| GetHashCode() |
Dient als Standardhashfunktion. (Geerbt von Object) |
| GetLifetimeService() |
Veraltet.
Ruft das aktuelle Lebensdauerdienstobjekt ab, das die Lebensdauerrichtlinie für diese Instanz steuert. |
| GetType() |
Ruft die Type der aktuellen Instanz ab. (Geerbt von Object) |
| InitializeLifetimeService() |
Veraltet.
Ruft ein Lebensdauerdienstobjekt ab, um die Lebensdauerrichtlinie für diese Instanz zu steuern. |
| MemberwiseClone() |
Erstellt eine flache Kopie der aktuellen Object. (Geerbt von Object) |
| MemberwiseClone(Boolean) |
Erstellt eine flache Kopie des aktuellen MarshalByRefObject Objekts. |
| ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |