MarshalByRefObject Sınıf
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Uzaktan iletişim desteği olan uygulamalarda uygulama etki alanı sınırları boyunca nesnelere erişimi etkinleştirir.
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
- Devralma
-
MarshalByRefObject
- Türetilmiş
- Öznitelikler
Örnekler
Bu bölüm iki kod örneği içerir. İlk kod örneği, başka bir uygulama etki alanında bir sınıfın örneğinin nasıl oluşturulacağını gösterir. İkinci kod örneği uzaktan iletişim için kullanılabilecek basit bir sınıfı gösterir.
Örnek 1
Aşağıdaki kod örneği, kodu başka bir uygulama etki alanında yürütmenin en basit yolunu gösterir. Örnek, yürütülmekte olduğu uygulama etki alanının adını görüntüleyen bir yöntemle öğesini devralan Workeradlı MarshalByRefObject bir sınıfı tanımlar. Örnek, varsayılan uygulama etki alanında ve yeni bir uygulama etki alanında örneklerini Worker oluşturur.
Note
içeren Worker derlemenin her iki uygulama etki alanına da yüklenmesi gerekir, ancak yalnızca yeni uygulama etki alanında mevcut olan diğer derlemeleri yükleyebilir.
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"
Örnek 2
Aşağıdaki örnek, daha sonra uzaktan iletişimde kullanılan öğesinden MarshalByRefObject türetilmiş bir sınıfı gösterir.
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
Açıklamalar
Uygulama etki alanı, bir veya daha fazla uygulamanın bulunduğu işletim sistemi işlemindeki bir bölümdür. Aynı uygulama etki alanındaki nesneler doğrudan iletişim kurar. Farklı uygulama etki alanlarındaki nesneler, nesnelerin kopyalarını uygulama etki alanı sınırları arasında taşıyarak veya ileti alışverişi için bir ara sunucu kullanarak iletişim kurar.
MarshalByRefObject , bir ara sunucu kullanarak ileti alışverişi yaparak uygulama etki alanı sınırları arasında iletişim kuran nesnelerin temel sınıfıdır. öğesinden MarshalByRefObject devralmayan nesneler, değere göre örtük olarak sıralar. Uzak bir uygulama değer nesnesine göre bir sıralama nesnesine başvurduğunda, nesnenin bir kopyası uygulama etki alanı sınırları arasında geçirilir.
MarshalByRefObject nesnelere doğrudan yerel uygulama etki alanının sınırları içinde erişilir. Uzak uygulama etki alanındaki bir uygulama ilk kez bir öğesine eriştiğinde MarshalByRefObject, uzak uygulamaya bir ara sunucu geçirilir. Proxy'deki sonraki çağrılar, yerel uygulama etki alanında bulunan nesneye geri sıralanır.
Tür, uygulama etki alanı sınırları arasında kullanıldığında türünden devralınmalıdır MarshalByRefObject ve nesnenin üyeleri oluşturuldukları uygulama etki alanı dışında kullanılamadığından nesnenin durumu kopyalanmamalıdır.
Bir nesnesinden MarshalByRefObject uygulama etki alanı sınırları arasında kullanılmak üzere türetdiğinizde, üyelerinden herhangi birini geçersiz kılmamalısınız veya yöntemlerini doğrudan çağırmamalısınız. Çalışma zamanı, türetilen MarshalByRefObject sınıfların uygulama etki alanı sınırları arasında sıralanması gerektiğini tanır.
Oluşturucular
| Name | Description |
|---|---|
| MarshalByRefObject() |
MarshalByRefObject sınıfının yeni bir örneğini başlatır. |
Yöntemler
| Name | Description |
|---|---|
| CreateObjRef(Type) |
Uzak bir nesneyle iletişim kurmak için kullanılan bir ara sunucu oluşturmak için gereken tüm ilgili bilgileri içeren bir nesne oluşturur. |
| Equals(Object) |
Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler. (Devralındığı yer: Object) |
| GetHashCode() |
Varsayılan karma işlevi işlevi görür. (Devralındığı yer: Object) |
| GetLifetimeService() |
Geçersiz.
Bu örnek için yaşam süresi ilkesini denetleen geçerli yaşam süresi hizmet nesnesini alır. |
| GetType() |
Geçerli örneğin Type alır. (Devralındığı yer: Object) |
| InitializeLifetimeService() |
Geçersiz.
Bu örneğin yaşam süresi ilkesini denetlemek için bir yaşam süresi hizmet nesnesi alır. |
| MemberwiseClone() |
Geçerli Objectbasit bir kopyasını oluşturur. (Devralındığı yer: Object) |
| MemberwiseClone(Boolean) |
Geçerli MarshalByRefObject nesnenin sığ bir kopyasını oluşturur. |
| ToString() |
Geçerli nesneyi temsil eden bir dize döndürür. (Devralındığı yer: Object) |