class1.cs

来自「C#开发教程 由浅入深 配有实例 是初学者的好帮手」· CS 代码 · 共 100 行

CS
100
字号
using System;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Messaging;	// for IMessageSink
using System.Runtime.Remoting.Activation;	// for IConstructionCallMessage
using System.Threading;

namespace ContextAttribs
{
	public class FooObjectSink : IMessageSink
	{
		private IMessageSink next;
		public FooObjectSink (IMessageSink ims) { next = ims; }
		public IMessage SyncProcessMessage (IMessage imCall)
		{
			Console.WriteLine("\nPreprocessing...");
			IMessage imReturn = next.SyncProcessMessage(imCall);
			Console.WriteLine("...Postprocessing\n");
			return imReturn;
		}
		public IMessageCtrl AsyncProcessMessage (
			IMessage imCall, IMessageSink ims) { return null; }
		public IMessageSink NextSink { get { return next; } }
	}

	public class FooProperty : 
		IContextProperty, IContributeObjectSink
	{
		public IMessageSink GetObjectSink(
			MarshalByRefObject o, IMessageSink next)
		{
			return new FooObjectSink(next);
		}
		public bool IsNewContextOK(Context c) { return true; }
		public void Freeze(Context c) { return; }
		public string Name { get { return "Foo"; } }
	}

	[AttributeUsage(AttributeTargets.All)]
	public class FooAttribute : ContextAttribute
	{
		public FooAttribute() : base("Foo") 
		{
			Console.WriteLine("FooAttribute instance ctor");
		}
		static FooAttribute()
		{
			count = 1;
			Console.WriteLine("FooAttribute static ctor");
		}
		public static int Count
		{
			get { return count++; }
		}
		private static int count;

		public override bool IsContextOK(Context c, 
			IConstructionCallMessage ctor)
		{
//			return true;
			return false;
		}
		public override void GetPropertiesForNewContext(
			IConstructionCallMessage ctor)
		{
			ctor.ContextProperties.Add(new FooProperty());
		}
	}

	[Foo]
	public class SomeClass : ContextBoundObject
	{
		public string name;
		public SomeClass(string s)
		{
			name = s;
			Console.WriteLine("{0} created", name);
		}
		public void SomeFunc()
		{
			Console.WriteLine("{0}, SomeFunc: {1}", 
				name, FooAttribute.Count);
		}
	}

	class Test1
	{
		[STAThread]
		static void Main(string[] args)
		{
			SomeClass sc = new SomeClass("Bill");
			sc.SomeFunc();

			SomeClass sc2 = new SomeClass("Mary");
			sc2.SomeFunc();

			sc.SomeFunc();
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?