C#高级编程学习笔记
上接笔记P478
第19章程和同 记记步
1. 监监监监监监监监监监监监监监监监监监监监监监监监监监监监听器程:等待客的求,接收到求后,就把它送另一个
工作程,之后立即返回,接收下一个求。监监监监监监监监监监监监监监监监监监
监监监监监监监监监监监监监监监监监监监监监监监监监程包含源,且个程都分配了虚内存。一个程至少包含一个每程,操作系会度程。程有一个先、正在理的程序的位置数监监监监监监监监监监监监监监监监监监监监监监监监监监监监
器、一个存其本地量的堆。监监监监监监监监监监监监监监监监监监监监监监监监监个程都有自己的堆,但程序代的每
内存和堆由一个程的所有程共享,程的所有程址相同的虚内存,。监监监监监监监监监监监监监监监监监监监监监监监监监监监监监
2. 异委托。步
监监监监监监监监监监监监监监监监监监监监监建程的一方式是定一个委托,异用它。步Delegate监监监监监监监监支持异用方法。在后台,会建步
一个行任的程。,委托使用程池来完成异监监监监监监监监监监监监监监监监监监监监监监监任,。步
Delegate监提供了方法BeginInvoke()方法,在方法中,可以送用委托型定的监监监监监监监监监监监监监监监监监监入参数。个方法除委托定的参数外是有两个监监监监监监监监监监监监监监监监监监监AsyncCallback和Object监监监监型的外参数。BeginInvoke()方法返回型:监监监监IAsyncResult。在个中,可以得委托的信息,并通其监监监监监监监监监监监监监监监监监监监IsCompleted属性来委托是否完成了任。监监监监监监监监监监监监
除了委托是否完成之外,可以在完成了由主程行的工作后,用委托型的监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监EndInvoke()方法。监监监监监方法会一直等待,直到委托完成其任止。
IAsyncResult的AsyncWaitHandle属性可以等待句柄。个属性是一个监监监监监监监监监监监监监监WaitHandle监监监监监型的象,他可以等待委托程完成其任。方法监监监监监监监监监监WaitOne()将一个超作可的第一个参数,来监监监监监监监监监监监监监监监定要等待的最大,位毫秒。操作成功后,可以用委托的监监监监监监监监监监监监监监监监监监监监监监监监监监监监EndInvoke()方法接受返回果。监监监3. Thread监。其构造
函
关于工期滞后的函关于工程严重滞后的函关于工程进度滞后的回复函关于征求同志党风廉政意见的函关于征求廉洁自律情况的复函
数可接受ThreadStart或ParameterizedThreadStart监监监监型的委托参数。在建了Thread监象或,就可以用Start()方法启程了。监监监监监
ThreadStart委托定了一个返回型监监监监监监监监监void的无参数方法。示例:
static void Main()
Thread t1=new Thread(ThreadMain);
t1.Start(); //监监监监监监监监监监监监监监监监监监监监监两句的打印序并不固定,因程由系度
Console.WriteLine(“This is the main thread”);}
static void ThreadMain()
Console.WriteLine(“Running in a thread.”)}
可以使用Thread.CurrentThread静属性取当前程的监监监监监监监监监监Thread监监监监例,可以其Name属性或托管的程监监ID:ManagedThreadID属性。
4. 监监监监监监监程送数据。
可以使用ParameterizedThreadStart委托参数来构造Thread监监监监监监监监。参数一个object监监监型参数返回void的方法委托,可将数据入。也可以使用此方式:监监监监监监监监监监监监Thread t2=new Thread(自定象监监监.方法名);5. 后台程。监监监
在默情况下,用监监监监监监Thread监监监监监监监监监监监监监监监监监监监监监监监监建的程是前台程,程池中的程是后台程。
用Thread监监监监监监监监监监监监建程,可以置属性IsBackground,以确定程示前台程是后台程。监监监监监监监监监监监监监监监注:如果多个前台程在运行,而监监监监监监监Main方法束了,用程序程依然示激活的,监监监监监监监监监监监监监监监监监直到所有前台程完成其任止。后台程在程序后也自退出。监监监监监监监监监监监监监监监监监监监监监监监监监监
6. 监监监监监程的先。
在Thread监监监中,可以置Priority属性,以影响程的基本先。属性一个监监监监监监监监监监监监监监监ThreadPriority枚。监监监定的有监监监监监Highest、AboveNormal、BelowNormal和Lowest。
7. 控制程。监监监
Thread监象的Start()方法可以建程。但是,在用监监监监监监监监监监监Start方法后,新程仍不在监监监监监Running状,监监而是在Unstarted状,直到程度器运行了程。取监监监监监监监监监监监监监监监监监监监监Thread.ThreadState属性,可以得监监监程的当前状。监监
使用Thread.Sleep()方法,会使程于监监监监WaitSleepJoin状,在制定的后,程就监监监监监监监监监监监监监监会再次被用。监监监
要停止另一个程,可以使用监监监监监监监Thread.Abort()方法。用此方法,会在接到中止命令的程中抛出监监监监监监监监监监监监监监监监监监监监监ThreadAbortException监监监监监监监监监监监监监监监监监监监型的异常。用一个理程序捕个异常,程可以在束
前完成一个清理工作。程可以在接收到用监监监监监监监监监监监Thread.ResetAbort()方法的果监监ThreadAbortException后监监监监监监监监监监监监监监监监监监监监监监监监监运行。如果程没有重置中止,接收到中止求的程状将从AbortRequested改监Aborted。
如果需要等待程的束,可以用监监监监监监监监监监Thread.Join方法。方法会停止当前程,把它置监监监监监监监监监监监监监监监监WaitSleepJoin状,直到加入的程完成止。监监监监监监监监监监监监监监
8. 监程池,ThreadPool监。//P486
在双核CPU中,默置监监监监50个工作程和监监监1000个I/O监程。ThreadPool监监监监监监监会在需要增减池中程的个数,直到最大的程数。也可以指定在建程池立即启的最小监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监程数,以及程池中可用的最大程数。如果程的使用达到极限,最新的工作就要排。通QueueUserWorkItem()方法添加程池。监监监监监
监程池的限制:
1,监监监监监监监监监监监监监监监监监监监监程池中的所有程都是后台程。且不能改前台程。
2,不能程池中的程置先或名称。监监监监监监监监监监监监监监监监监
3,监于COM监监监监监监监监监监监监监监监监监监象,程池中的所有程都是多程元,multithreaded apartment,MTA,程。多监监监监监
COM监监监监监监监象都需要程元,single-threaded apartment,STA,程。监监监
4,监监监监监监监监监监监监监监监监监监监监监监监监监监监监监程池中程只能用于短的任。如果程要一直运行,就使用Thread监监监监监建一个程。9. 监监监监程。
监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监条件:如两个或多个程相同的象,或者不同的共享状,就会出条件。要解除,可用步
lock监监监监监监监监监监监监监句定在程中共享的量。
死:在死中,至少有两个程被挂起,等待方解除定。此监监监监监监监监监监监监监监监监监监监监监监监监监监监监监
监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监程将无限等待下去。从一始就好定序,或者定定超,可以避免。
10. 同技。步监监
可用于多个程的同监监监监技:lock步监句、Interlocked监、Monitor监、等待句柄、Mutex监、Semaphore监、Event监、ReaderWriterLockSlim监。其中lock/Interlocked/Monitor可用于程的同监监监监监监监监。其他提供步了多个程中的程同监监监监监监。步
注:lock监监监监监监监监监监监监监监监监监监监定的象只能是引用型。可以声明一个私有object监象,在lock中来定。监监监Interlocked监://P498,不明白,
Monitor监:Enter方法始定,监监监监监Exit方法解除定。可以使用监监监监监监监TryEnter方法送一个超来监监监监监监监监监行有限的定。监监监监监监
ReaderWriterLockSlim监监监监监监监监监监监监监监监监监监监监监提供了一个定功能,只写入器定源。可以有多
个,但只能有一个写入。监监监监监监监监监监监监
11. 基于事件的异模式。步//P512
BackgroundWorker监。
第20章安全性
//P522
1. 身份和授。监监监监监监
监监和Principal:使用可以运行用程序的用。监监监监监监监监监监监监监监监监WindowsIdentity监
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示一个Windows用。监监如果没有用Windows监监监监监监监监监监监监监监用,也可以使用了IIdentity接口的其他。个接口可以监监监监监监监监监监用名、用是否得和型等信息。监监监监监监监监监监监监监监监监监监监监监
Principal是一个包含用和用所属角色的象。接口监监监监监监监监监监监监监监监监IPrincipal定了返回监监监监IIdentity监象的属性Identity和方法IsInRole,方法可以用是否是指定角色的一个成。监监监监监监监监监监监监监监监监监监监监监监
.Net中的Principal监有WindowsPrincipal和GenericPrincipal。可以建了监监监监监监监监IPrincipal接口的定制Principal监。
监监监监底的Windows监监需要引用System.Security.Principal和System.Threading。.NET不会自填充程的监监监监监监CurrentPrincipal属性。
使用WindowsIdentity.GetCurrent()可以监监Windows监监监监监监监的信息。
//P524
2. System.Web.Security命名空中的监监监Membership和Roles监。
使用Membership监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监可以、建、除和找用,改密以及与用相的多其他操作。
使用Roles监监监监监监监监监监监监监监监监监监监监监监监监可以添加和除角色,用取角色,改用的角色。角色
和用的存位置取决于提供程序监监监监监监监监监监监监监(如:ActiveDirectoryMembershipProvider、SqlMembershipProvider、ClientFormsAuthenticationMemebershipProvide
r和ClientWindowsAuthenticationMembershipProvider)。
身份监监监监监监监服必在Web.config中配置,从安全的角度来看,最好用包含用程序监监监监监监监监监监监监服的服器配置SSL。
3. 在.Net Framework中,可以使用System.Security.Cryptography命名空中的来加密。监监监监监监监监
第二十一章本地 化
//P573
1. 在命名空监System.Globalization中,最重要的是监监CultureInfo。个表示监监监监监监监监监监监监文化,定了日监、数字和日期的格式、以及和文化一起使用的排序字符串。
监RegionInfo表示区域监监监监监监监监监监监监监监监监监置,明区域是否使用米制系。
2. 数字格式。
数字监监监监监监监监监监构等都有一个重的ToString()方法。个方法可以一个监监监监监监监监监监监监监监监监监监字符串和一个IFormatProvider接口的。监监监监监监监监监监监监监监监监监监监监监监字符串制定表示法的格式。个格式可以是准数字格式化字符串或者形数字格式化字符串。于前者,监监监监监监监监监监监监监监字符串是定的,C表示,监监监D表示小数,E表示科学监监监监数法,F表示定点监监监出,G表示一般监监监出,N表示数字,X表示十六监监监监监监监监监监监监监制。于后者,可以指定位数、和分监监监监监监监监监监监监监”隔符、百分号等,如###,###”。
IFormatProvider接口由NumberFormatInfo、DateTimeFormatInfo和CultureInfo监监监监监监监监监监监监。个接口定了方法GetFormat(),返回一个格式象。监监监
3. 日期格式,也有重的监监ToString方法。
DateTimeFormatInfo指定的格式字符串由不同的含,如监监监D表示监监监监监监日期格式,d表示短日期格式,ddd表示星期的写,监监监dddd表示星期的全程,yyyy表示年份,T表示监监监监监监格式,t表示短监监监监监格式。4. 监源。
监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监源文件包含形、字符串表等。建源文件可以使用一般的文本文件,或者是利用XML的.resX文件。监源文件生成器:resgen。工监监监监监监监监监监监具不支持添加形。
用法:resgen strings.txt,会建监监监监监监监二制文件strings.resources,
resgen strings.txt strings.resX,会建监监XML文件strings.resX,
可以使用ResourceWriter监或ResXResourceWriter监监监监监监监监监监监监监监以程方式把形添加源中。
ResXResourceWriter监的AddResource()方法可以添加至多2GB的源。监监监
要监监监监监监监监监监监监嵌入的源,可以使用System.Resources.ResourceManager监。
第二十二章事理 记记记
1. 事理常用于数据,但监监监监监监监监监监监监监利用System.Transactions命名空中的,可以不定的、监监监监监监监监监监监监监监基于内存的象行事理。在监监监监监监监监监监Windows Vista中,文件系和注监监监监监监监监监监监监监册表也支持事理。事理分激活、监监监监监监监监监监监监监监监监监监准和提交三个段。
激活记记段:在个监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监段建事理。源管理事理的源管理器可以用事理登。准段记记记:在个监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监个源管理器都可以定事理的果。事理的建者出束事理的指每段,
令,就启个监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监段。事理管理器所有的源管理器出一个准消息。如果源管理器可以成功生成事理的果,就监监监监监监监 监监监监监监监监监监监监监监。如果向事理管事器出一个未准已准好的消息好,就可以中止事理,
出一个回监监监监监监监监监监监监监监监监监监监监监监监监监制事理管理器行回操作。在出了消息,已准好消强息后,源管理器监监监监监监监监监监监监监监监监监监监监监监监监监监监监必保在提交段能成功完成工作。此,定的
监监监监监监监监监监监监监监监监监监监监监监监监监监监监源管理器必将准状信息写一个日志,,在准和提交程中出监监监监监监监监监监监监监监监监监监监停等故障,就可以从状行。
提交段记记:当所有的源管理器都成功监监监监监监监监监监监监监监监监监监监监监监监监准好了,就始个段。即所有监监监监监监监监监监监监监监监监监监监监监监监监监监监源管理器都出了已准好消息。接着,事理管理器就所有参与
者送一个提监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监交消息,完成工作了。源管理器理完后,返回已提交消息。
2. ADO.NET事理不是分监监监监监监监监监监监监监监监监监监监监监监监监监监布式事理,不支持跨多个接的事理,它是到一个接上的本地事理。监监监监监监监监监监监监监监监监监监
System.EnterpriseService中的事理:不需要明确行事理,运行会自监监监监监监监监监监监监监监监监监监监监监监监建事理,只需有事理要求的添加监监监监监监监监监监监监监监监监监监[Transaction]特性即可。[AutoComplete]特性把方法自监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监置事理的状位:如果方法成功,就置成功位,因此提交事理。如果监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监生异常,就中止事理。方式的点是多个象能监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监松地运行在同一个事理中,事理可以自登。缺点是它需要COM+主机模型,个监监监必派生监监监监监监自基ServicedComponent
3. System.Transactions命名空:监监
包含以下:监监
Transaction:所有事理的基,定了所有事理都可以使用的属性、方法和事件。监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监CommittableTransaction:是唯一一个支持提交的事理。个有一个监监监监监监监监监监监Commit方法,其他事理监监监
监监监监监监都只能行回。
DependentTransaction:用于依于其他事理的事理。依的事理可以监监监监监监监监监监监监监监监监监监监监监监监依从可提监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监交的事理中建的事理。如果事理成功,就把
依的事理添加到可提监监监监监监监监监监监监监监监监监监监监监监交的事理的果中。
SubordinateTransaction:和分布式事理器监监监监监监(DTC)一起使用。个表示监监监监监监监监监监监监监监监监非根事理,但可以由DTC管理。
Transaction监监的成
4. 可以将一个接象使用监监监监监监Transaction监象的EnlistVolatile方法登监监监监监监监监监监到事管理器。例:
static void Main(string[] args)
{
CommittableTransaction tran = new CommittableTransaction();
try
{
AddStudent(tran);
AddStudent(tran); //跨多连接连升连连分布式事连~需打连个会DTC服连
AbortTx();
tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
Console.WriteLine(ex.Message);
}
}
private static void AddStudent(Transaction tran)
{
string strConn = "Server=.;database=mytestdb;uid=sa;pwd=dcjet";
SqlConnection conn = new SqlConnection(strConn);
string strSql = "insert into Student values(1,'连三')";
using (conn)
{
conn.Open();
if (tran != null)
{
conn.EnlistTransaction(tran);
}
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = strSql;
cmd.ExecuteNonQuery();
}
}
public static void AbortTx()
{
Console.WriteLine("连连入是否中止事连(y/n),\n");
if (Console.ReadLine().ToLower() == "y")
{
throw new ApplicationException("事连被中止");
}
}
5. 事理的监监监监监监监升。
System.Transactions支持可升监监监监监监监监监监监监监监监监监监监监监监监的事理。根据参与事理的源,会建本地的事理或分监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监布式事理。事理始可以置本地事,之后
根据需要升监监监监监监监监监监监监监监监监监监监监监监监监监分布式事理。,如操作象位于两个接中,。
事理监监监监监监监监监监监监监监监监监监监升需要启分布式事理器(DTC)。可以在件“监监—服DTC”中监监监监监监监监监监监看运行在系上的所有DTC事管理的状。监监监监监监监
6. 依的事理监监监监监监DependentTransaction。
使用依的事理,可以影响多个程中的监监监监监监监监监监监监监监监监监监监监监监监监监监监监监某个事理。依事理会依靠另一个事理,影响事理的果。监监监监监监监监监监监监监监
依事理可以用监监监监监监监监监Complete或Rollback方法来定事理的果。监监监监监监监监监方法DependentClone()需要一个DependentCloneOption监监监监监监监监监监监监监监监监型的元。型是一个枚,其是BlockCommitUntilComplete和RollbackIfNotComplete。如果根事理在依事理之前完监监监监监监监监监监监监监成,个就监监监监监监监监监监监监监监监很重要。把RollbackIfNotComplete,如果依事理没有在监监监监监监监监监监监监监监根事理的Commit方法
之前用监监Complete方法,事理就中止。把置监监监监监监监监监监监监监监BlockCommitUtilComplete,方法Commit就等待
由所有依事理定的果。监监监监监监监监监监监
static void Main(string[] args)
{
CommittableTransaction tran = new CommittableTransaction();
try
{
new
Thread(AddStudent).Start(tran.DependentClone(DependentCloneOption.BlockCommitUntilComplete));
AbortTx();
tran.Commit();
}
catch (Exception)
{
tran.Rollback();
}
}
private static void AddStudent(object obj)
{
DependentTransaction tran = obj as DependentTransaction;
Thread.Sleep(3000);
tran.Complete();
}
7. 监监监监境事理
使用监监监监监监监监监监监监监监监监监监监监监监监监监监监监监境事理,就不需要手工登与事理的接,在支持境事理的源中,是自的。监监监监监监监监监监监监监监监监
监监监监监监监监监监监监监监监监监监监监监监监境事理与当前的程起来。可以使用静属性Transaction.Current监监监监监监监监监取和置境事理。支持监监监监监监监境事理的API会个属性,以得监监监监监监监监监监监监监监监监监监监监监监监监监监境事理,用事理登。ADO.NET监接支持监监监监监境事理。
监监监监监监监监监境事理建方式:
1. 可以建一个监监监监CommittableTransaction监监监监监象,把它予属性Transaction.Current,以初始化境监监监监监监监事理。2. 另一方式是使用监监监监监监TransactionScope监监监监监监监监监监监监监监监监监,其构造函数会建一个境事理。了IDisposable,可用using监监监监监监监监句用于事理作用域。
注:如果ADO.Net监监监监监监监监监监监监监监监监监监监监监监监监监监接不使用境事理来登,就可以用接字符串置Enlist=false。8. 嵌套的作用域和监监监监监监境事理
使用TransactionScope监监可以嵌套作用域,嵌套的作用域可以位于原来的作用域中,或位于从作用域中用的方法里。
嵌套的作用域可以使用与外作用监监监监监监监监监监监监监监监监监监监监监监监域相同的事理,抑制事理,或建独立于外作用监监监监监监监监监监监监监监监监监监监域的新事理。作用域的要求通TransactionScopeOption枚来定。监监监监监TransactionScopeOption枚:监监Required指定作用或需要一个事理,如果外监监监监监监监监监监监监监已包含一个监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监境事理,内的作用域就使用已有的事理,两个域都会影响果,,RequiresNew监监监是建一个新的事理,内的事理是完全监监监监监监监监监监监监监监监监监监监监监监监监监监监监监独立的,可以独立地提交或中止。Suppress表示无外的监监监监作用域是否包含一个事理,作用监监监监监监监监监监监监监监监监监监监域都不会包含境事理。
9. 多程中的监监监监监监监监监监监境事理。
一个监监监监监监监监监监监监监监监监监监监监监监监监监监监监监境事理定到一个程上,所以如果建了一个新程,它
就不会有起始程中的监监监监监监监监监监监监监监监监监监监监监监监监监监境事理。要在另一个程中使用同一个境事理,需要使用依事理。如:在监监监监监监监监监监监监监监监监监监Scope中用新程:监监监监监监
new
Thread(xxx).Start(Transaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete))
10. 隔离(Isolation)监监。
出于性能原因,可以降低隔离要求。但不完全隔离事理外监监监监监监监监监监监监监监监监监监监监部的作用域可能出以下三:1) 监监监监监监监监监监监监监监监监监监监监监监监监监监监监监取:一个事理可以取在另一个事理中改的,因在另一
个事中改的可能被回。通定要改的,就可以避免个。监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监2) 不能重的取操作:数据在事中取被另一个事理监监监监监监监监监监监监监监监监监监监监监监监监监监监监修改。即在事理中取多次果就会不同。定取的,即可避免个。监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监
3) 幻影取:使用监监监监监where监监监监监监监监监监监监监监监监监监监监监监监行取一个范内的,会出相同的条件而返回数量不同的。个可以通监监监监监监监监监监监监监监监监监监监范定来避免。
在定监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监隔离要求,可以置隔离。在建事理,会通构造函数配置枚。
IsolationLevel枚定了定操作,其如下:监监监监监监监监监监监监监监
监监监监监监监监监监监监监监监监监置最常用的事理隔离可能出的:
11. 定制源管理器。监监监监监监
新事理模型的最大监监监监监监监监监监监监监监监监监监监监监监监监监监监监监点是:很容易建参与事理的定制源管
理器。源管理器不管理定的源,管理不定或内存中的源,例如的监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监int和泛型列表。监监监监监监源管理器了接口IEnlistmentNotification,接口定了方法监监监监监监监监Prepare()、InDoubt()、Commit()和Rollback()。作事管理的一监监监监监监监监监监监监监监监监监监部分,源管理器必用Transaction监监监监监监监监监监来登。不定的源管理器用方法监监监监EnlistVolatile(),定的源管理器用方法监监监监监监监监监监监监EnlistDurable()。根据事理的果,监监监监监监监事理管理器通源管理器从监监监监监监监监监监监监监监IEnlistmentNotification接口中中用不同的方法。监监监监监监监监
12. 事理的源。监监监监监监监
事理的源监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监必保存和。从事理的外部取,定了事理回的有监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监效状。定了事理提交的有效状。
监监监监监监监监监监监监监监监监监监监监监监监了使非事理型成事理型,可定以下泛型Transactional
:
注:可以用于使监监监监监监监监监监监监监监监监监监监监监监监监监监监监监非事理,可串行化的,成事理。
第23章 Windows服记
1. Windows服监监监监监监监监监监监监监监监监监监监监监监监指的是操作系启可以自打的用程序。Windows服监监监监监监监可以在没有交互式用监监监监监监监监监监监监监监监监监监监监监监监监监登系的情况下运行,在后台行某些理。可以把Windows服监监监监监监监监监配置从已行特殊配置的用或系用上运行,用的监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监力比系管理的力更大。
操作Windows服记记记需要3记记记记记记记记记记记记记记记记记记记程序:服程序、服控制程序、服配置程序。
服监监监监监监监监监监监监监监监监监监监监监监监监监监监程序本身用于提供需要的功能,服控制程序可以把控制求送监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监服,例如始、停止、停和。使用服配置程序可以安装服监监监监监监监监监监监监监监监监监监监监监监监监监监监监,意味着服不但要制到文件系中,要写到注册表中,并配置一个监监监监监监监监监监监监监监监监监监监监监监监监监监监监服。此外,服配置程序可以在以后改服的配置。
2. 服监监监监程序。
服监监监监监程序需要3个部分:主函数、service-main函数、理程序。监监监监监
服记记记记记记控制管理器(Service Control Manager,SCM):是操作系的一个成监监监监监监监监监监监监部分,它的作用是与服监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监行通信,可以把启服或停止服的求送服。其通信理方式如下:如果将服监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监置自启,在系启,将启服的程,而用程
的主函数。服监监监监监监监监监监监监监一个它的服都注册一个service-main每函数。主函数是服监监监监监监程序的入口,在监监监里,service-main函数的入口必监监用SCM注册。
主函数、service-main和理程序记记记记:服监监监监监监监监监监监监监监监监的主函数是程序的一般入口点,即Main方法,它可以注册多个service-main函数,service-main函数包含服监监监监监监监监监监监监监监监监监个的功能。服注册服必一个每所提供的service-main函数。服监监监监监监监监监监监监监监监监监监程序可以在一个程序中提供多服。
SCM监监监监监监监监监监监在一个启的每服用service-main函数。函数的一个重要任是用监监监监监监监监监监监监SCM注册一个理监监程序。
监监监监监监监监监监监监监监监监监监监理程序函数是服程序的第三部分,理程序必来自SCM的事件作出响。监监监监监监监监服可以停止、监监监监监监监监监监监监监监监监监监监监停或重新始,理程序必些事件做出响。
一旦使用SCM注册了理程序,监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监服控制程序可以把停止、停和服的求送SCM。服监监控制程序独立于SCM和服监监监监监监监监监监监监监监监监监监监监本身。在操作系中有多服控制程序。
服监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监控制程序:可以控制服、服的状,行响定制控制代的定制理程序。
服监监监监监监监监监监配置程序:不能使用XCOPY安装服监监监监监监监监监监监监监监监监监监,服必在注册表中配置,注册表包含了服监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监的启型,启型可以置自、手或禁用。必配置服监监监监监监监监监监监监监监监监监监监监监监监监监监监监程序的用、服的依存系,如一个服必参另一个服始之前启,,所有的配置工作都在监监监监监监监监监监监监监监监监监监监监监监监监监监监服配置程序中行,安装程序可以使用服监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监配置程序配置服,服配置程序也可以在以后改服配置参数。
3. 在.Net中,可以在System.ServiceProcess命名空中找到监监监监监监监监监服的3个部分的服监监监:,从ServiceBase监监监监监监监监监监承的可以服。ServiceBase监监监监监监监监监监监监监用于注册服、响始和停止求。,ServiceController监监监监监监监监监监监监监监监监监监监监监监监监监监监用于服控制程序。使用个,可以把求送服。,ServiceProcessInstaller监和ServiceInstaller监监监监监用于安装和配置服程序。
4. 服监监监监监的属性:
,AutoLog:指定启和停止监监监监监监监监监监监监监监监监监监监 服的事件自写到日志文件中。
,CanPauseAndContinue、CanShutdown和CanStop指定服监监监监监监监监监监监监监监监可以理停、、和停
止服监监监监监的求。
,ServiceName是写到注册表中的服监监监监监监监监监监监监监监监监监名称,使用个名称可以控制服。
,CanHandleSessionChangeEvent确定服监监监监监监监监监监监监监监监监监监监是否能理端服会中的改事件。
,CanHandlePowerEvent监监监监监监监监监监监监监监监监监监监监监运行在膝上算机或移上的服有效。如果启
用个,监监监监监监监监监监监监监监监监监监监监监监监监监监监监服就可以响低源事件,改服的操作方式。
5. ServiceBase监:是所有Windows服监监监监监监监监监监监监监监监监监的基,使用一个未的帮助System.ServiceProcess.NativeMethods与SCM监行通信,NativeMethods是Win32 API监监监用的包装。启程:监监监监SCM启启的监监监监监监监监监监监监监监监监监监监服程。首先用程序集的Main()方法。在Main方法中,用监监ServiceBase基的监监Run()方法。Run使用SCM中的NativeMethods.StartService CtrlDispatcher()注册ServiceMainCallback()方法,并把写到事件监监监监监监监监监监日志中。
接下来,SCM在服监监监监监监监监监监程序中用已注册的ServiceMainCallback()方法。方法本身使用监监监监监监监NativeMehtods.RegisterServiceCtrlHandler[Ex]()在SCM中注册监监监监监监监理程序,并在SCM中置监监监监监监监服的状。之后用监监OnStart()方法。在OnStart()方法中,必监监监监监监监监监监行启代。如果OnStart()监行成功,就把字符串Service Started Successful写到事件日志中。
监理程序是在ServiceCommandCallback()方法中行的。当改了监监监监监监监监监监监监监监监监服的求,SCM就用监监ServiceCommandCallback()方法。方法再把求送监监监监监监监监监监
OnPause()、OnContinue()、OnStop()、OnCustomCommand()和OnPowerEvent()。如:监监6. 主函数。
static class Program
{
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new MyService() //如需行多服连~连把具服连连添加至此可运个体即
};
ServiceBase.Run(ServicesToRun);
//只有一服连连~连行下句可个即
//ServiceBase.Run(new MyService());
}
}
注:如果有多个服监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监运行在一个程中,且需要初始化多个服的某些共享状,共享的初始化必在Run方法运行之前完成。在运行Run()方法,主程于停监监监监监监监监监监监监监监监监监监监滞状,直到服程停止止,以后的指令在监监监监监监监监监监监监监监监监监监监监服束之前不能行。
初始化花监监监监监监监监监的不超30秒。超出此,监监监监监监监监监监监监监监监监监监监监服控制管理器就服启失了。如果初始化的,就在另一程中行监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监初始化,以便主程及地用Run()。然后,事件监象可以用信号通知监监监监监监监监监监监监程已完成了它的工作。
7. 其它方法。
OnPowerEvent():在系的源状监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监生化,用个方法。源状生化的信息在PowerBroadcastStatus监监监监监监监监监监监监监型的参数中,型是一个枚,其是BatterLow和PowerStatusChange。在个监监方法中,可以得系是否要挂起的信息监监监监监监监监监监监监监监监(QuerySuspend),此可以同监监监监监监监监监监监意或拒挂起。OnCustomCommand():个理程序可以监监监监监监监监监监监监监监监监监监监监监监监监服控制程序送来的定制命令提供服监监监监监监监监监监监监监监监监监监监。方法有一个用于取定制命令号的int参数,号监监监监监监监的取范是128至256,小于128的监是系监监监监监监监留的。
8. 服监监监监监的安装。
服必监监监监监监监监监监监监监监监监监监监监在注册表中配置,所有的服都可以在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services中找到。在注册表中,可以看到服监监监的型、示名称、可行监监监监监监监监监监监监监监监监监监监监监监监监监文件的路径、启配置以及其他信息。
在服监监监监监——监监监监监监添加安的模式下点右装程序,会建一个新的ProjectInstaller监、一个ServiceInstaller监例和一个ServiceProcessInsatller监监监例。如下:
ProjectInstaller监:派生自System.Configuration.Install.Installer监监监监监监监监,它是所有定制安装程序的基。使用Installer监监监监监监监监监监监监监监监监监监监监监监监监监,可以建基于事的安装。使用基于事的安装,如果安装失监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监了,系可以回到以前的状,安装程序所做的所有修改都会被取消。Installer监中有Install()、Commit()、Rollback()和Uninstall()方法,监监 的。如果些方法从安装程序中用RunInstaller属性的监监true,在安监监监监监监监监监监监监装程序集就会用ProjectInstaller监。定制的安装程序和installutil.exe都能属性。监监监监监监ServiceProcessInstaller监和ServiceInstaller监监监监监监监监监:两个都派生自ComponentInstaller监,ComponentInstaller
本身派生自Installer。从ComponentInstaller中派生出来的可以用作安监监监监监监监监监监监监监监监装程的一个部分。ServiceProcessInstaller监监监监监监监监监监监监监监监监监监监用于配置程,个程中所有服定。而ServiceInstaller监监监监用于服配置,因此,个每服监监监监都需要ServiceInstaller监监监监的一个例。
9. ServiceProcessInstaller监监监监监监监监监监包含用于整个程的属性。如下:
Account属性可以是监监监监ServiceAccount枚的任一。如:监监监监监监监监
10. ServiceInstaller是一个每服监监监监监监监监监监监监监都需要的,其属性如下:
注:如果在ServiceBase的派生监监监监监监监监监监监监监监监监中改了服的名称,必修改ServiceInstaller监象中ServiceName属性的。另外,在监监监监监监监监监监监监监监段,最好把StartType的置监监监监Manual,确信没有,可以在以后监监监监监监监监监改个配置。监监监监监监
11. ServiceInstallerDialog监:位于System.ServiceProcess.Design命名空下,在安监监监监监监监监监监装程中,如果希望系管理入用名和密,就可以使用个。如果监监监监监监监监监监监监监监监监监监监监监监监监ServiceProcessInstaller监的Account属性监监置ServiceAccount.User,Username和Password属性置监监监null,在安监监监监监监装,Set Service Login监监框将自监监监监监监监监监监监监示出来。此,也可以取消安装。
12. installutil.exe:在把安装监监监监监监监监监监监监监监监添加到目中之后,就可以使用installutil.exe监监监监监用程序安装和卸服了。监监监监监监监监监监监监监个用程序可以用于安装包含Installer 监监监监监监监监监监监的所有程序集。用程序用派生于Installer监的方法Installer()监监监行安装,用UnInstaller()方法行监监监监监卸。
安装和卸服监监监监监监监监监监的命令分是:
installutil quoteservice.exe
installutil /u quoteservice.exe
注:如果安装失监监监监监监监监监监监监了,要安装日志文件InstallUtil.InstallLog和.InstallLog。通常在安装日志文件中可以一监监监监监监监监监监监监些非常有用的信息。
13. 服监监监监监监监监的和控制。
net.exe:命令行用程序,使用个程序可以控制监监监监监监监监监监监监监监监监监监服。
sc.exe:命令行用程序,它的功能监监监监监监监监监监比net.exe更强大,是Platform SDK的一部分。可以监监监监监监监服的状,配置、除以及添加监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监服。当服的卸程序不能正常工作,可以使用sc.exe卸服监监监监。注:net start 和net stop 可以监监监监监服。
Visual Studio中的Server Exploer也可以控制服监监监监监监监监监监监监监监监监监监监,一个服,打出菜,就可以启和停止监监监监监监监监监监监监监监监监监监监服。个出菜也可以用于把ServiceController监监监监监添加到目中。
如果要控制用程序中的监监监监监监监监监监监监监监监监监监具体服,可以把服从Server Explorer拖放到器上:即把监监监监监监监ServiceController监监监监监监监例添加到用程序中,ServiceController监监监监监监监监监监监监监象的属性自置中的服,引用程序集System.ServiceProcess.dll。
14. ServiceController监。其属性如下:
其方法如下:
15. 交互式服监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监:如果要与用交互,可以配置一个交互式的服。如用于向用示出信息的Print Spooler服监监和NetMeeting Remote Desktop Sharing服监监监监监监监监监监就是交互式的服。
在配置交互式服监监监监监监监,必置Services配置工具中的Allow service to interact with desktop监监。把SERVICE_INTERACTIVE_PROCESS监监监监监监监监监监监监监监监监添加型,可以改服的型。
16. 监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监源事件:于所有的源事件而言,服可以接收有附加参数的控制代SERVICE_CONTROL_POWEREVENT。在参数中可以找到事件的原因,原因可以是池没了、监监监监监监系正于等待状或源状改了等。监监监监监监监监监监监监监监监监监监Win32 API方法RegisterServiceCtrlHandlerEx(),可以在SCM中注册监监监监监监监理源事件的Windows服监监。
如果CanHandlePowerEvent属性的监监true,就会用监监ServiceBase监的OnPowerEvent方法。可以重写个监监方法,接收源事件,监监监监监监监监监监监监监监监监监监监监监监监监监监监根据服的行情况行响。源事件的原因在PowerBroadcastStatus监型的参数中送。个枚的如下:监监监监监监监监监监监监
第24章 互操作性
1. COM和.Net的异同:
元数据:COM中件所有的信息都存在型中,型包含的信息有接口、方法和参数的名称和监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监ID等,在.NET中监监监监监监监监监监监监监监监监些信息都可以存在程序集中。而COM中,型是不能监监监监监监监监监监监展的,而.NET元数据可以使用定制特性来监监监展。
记放内存:.NET中内存的监监监监监监监监监监监监监放是由垃圾收集器完成的。COM依的是引用数。接口监监监监监监监监监IUnknown是个每COM监监监监监监监监监监监监监监象必的一个接口,它提供了3个方法,其中两个方法与引用数有。如果需要另监监监监监监监一个接口指,客程序就监监监监监监监监监监监监监必用方法AddRef(),个方法会增引用数。方法监监监监监监监监监监监监监Release()会减引监监监用数,如果所得的引用数是0,就象,监监监监监监监毁放内存。
接口:接口是COM的核心,它区分了在客程序和象之使用的监监监监监监监监监监监监监监监监监监监契和方式。COM有3记记接口型:定制接口、分派接口(dispatch interface)和双重接口。
定制接口:派生自接口IUnknown,定制接口定了虚表监监监监监(vtable)中的方法序,所以客程序监监监监监监监监监可以直接接口的方法。也表示在监监监监监监监监监监监监监监监监监监监监监监监监监监监监段客程序需要知道虚表,因方法的定是使用内存地址行的。因此,定制接口不能由监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监脚本客程序使用。
分派接口:因脚本客程序不支持定制接口,所以需要另外一接口型,监监监监监监监监监监监监监监监监监监监监监监监
而在分派接口中,可用于客程序的接口是监监监监监监监监IDispatch接口。IDispatch接口派生自IUnknown接口,除了接口IUnknown的方法外,它提供了监监监监4个方法,其中两个比监监监监监重要的是GetIDsOfNames()和Invoke()。在分派接口中需要两个表,第一个表把方法或特性名映射到分派ID(dispatch id),第二个表把分派ID映射到方法或特性的代。如下:监监监监监监监监监
在客程序用件中的方法,要先用方法监监监监监监监监监监监监监监监监监监监GetIDsOfNames(),并它送要用的方法名。方法监监监监监监监监监监监监监监GetIDsOfNames会找名称监监监监-ID表,返回分派ID,客程序再使用个监监监监监监监监ID监用方法Invoke()。
注意:通常,IDispatch接口的两个表存在型中,但不是监监监监监监监监监监监监监监监监监监监必需的,一些件把两个表存在其他地方。监监监监监监监监监监监监
双重接口:双重接口派生自IDispatch接口,但提供了可以在虚表中直接使用的接口方监监监监监监监监监监监法。脚本客程序可以使用监监监监监监监IDispatch接口用方法,而了解虚表的客程序可以直接用方法。如:监监监监监监监监监监监监监监监监监监监监监监监监监监监强制型和监监监监监QueryInterface:如果.NET监监监监监监监监监监监监监监多个接口,就可以行制型,得到一个强接口或另一个接口。而在COM中,接口IUnknown通方法监监监QueryInterface()提供了监监监监监监似的机制。方法定记记:客程序监监监监监监监监监监监监监监监监监监监监监监监监监监映射方法的方式是用早期定和后期定来定的。.Net使用System.Reflection命名空来后监监监监监监监监监期定,COM使用IDispatch接口行后监监监监监监监监监监监监监监监监期定,后期定可以使用分派接口和双重接口来。在监监监监COM中,早期监监监监监监监监监监监监监监监监定有两个方式:虚表定,直接使用虚表,可以通定制接口和双重接口来,监监监监监监监监监监监监监监监监监监监监监,id监定,分派id存在客程序代中,监监监监监监监监监监在运行期监监监监监监监监只需要用一次Invoke()。GetIdsOfNames()方法在监监监监监监监监监监监监监监监期用。于客程序,监监监监住不必改分派ID是非常重要的,。
数据型记记:于双重接口和分监监监监监监监监监监监监派接口,COM能使用的数据型被监监监监监监监监监监监监局限于一个自兼容的数据型监监监监监监监列表。接口IDispatch的Invoke()方法接收VARIANT数据型的数。监监监监监监VARIANT是多不监监监同数据型的监监监监监监监监合,例如BYTE、SHORT、LONG、FLOAT、DOUBLE、BSTR、IUnknown*、IDispatch*等。在.NET中,使用Object监代替了VARIANT。
在定制接口中,C++能使用的所有数据型也可用于监监监监监监COM。但是,使用个件的客程序只监监监监监监监监监监能采用某些言监监监监监监来程。
注册:.NET区分了私有程序集和共享程序集,而在COM中,所有的件都行了注监监监监监监监监监监册配置,是全局可用的。
所有的COM监象都有一个唯一的由128位的数字监监监监监监监监监监监成的符,也称ID(CLSID)。建监监COM监监象,COM API监用CoCreateInstance()会在注册表中找监监CLSID和DLL或EXE的路径,然后加监DLL或启监EXE,并例监监监监监监化件。
CLSID不容易监监监监监监监,所以多COM监监监监监象有一个prog id,监id很容易监监监监监,例如Excel.Application就映射到一个CLSID。
除了CLSID之外,COM监监监监监监监监监监监监监监监监监象个接口和型指定了一个每唯一的符(IID和typelib id)。2. 监程。
COM使用了元模型,程序就不监监监监监监监监监监监监监监监监监监监监监监监监监监监监监必考程了。但也增加了
性,不同的操作系监监监监监监监监监监监监监监版本添加了不同的元型。
监监监监程元(STA):是在Windows NT3.51中引入的。在STA中,只允监监监监监一个程(监监监监监监建例的程)监监监件。但是,在一个程中监监监监监监监监监监监监监监允有多个程元。COM监监监监监监监监监监监监监监象在程不是程安全的,因此STA需要在注册表中把注册监ThreadingModel监监置Apartment。
多程元监监监监(MTA):是在Windows NT4.0中引入的。COM监监监监监监监监监监监监监象在程是程安全的,因此MTA需要在注册表中把监ThreadingModel监监置Free。监Both用于不考监监监监监监监监监监监元型的程安全的COM监象。,注意:VB6不支持多程元,如果以监监监监监监监监VB6监监COM监监监监监监监监象,必了解一点,
3. 监监监理。
在.NET中,是通抛出异常来监监监监监监监监监监监监监监监生成的。在COM技中,是通方法返回监监监监监监监监监监监监HRESULT监监监来定的。HRESULT的是监监S_OK,表示方法成功。如果COM监监监监监监监监监件提供了的消息,COM监监监监监件就接口ISupportErrorInfo,接口不但提供了监监监监监监监监监监监监监监监监监监监监监监监监消息,提供了帮助文件的接、监监监监监监监监监监监监监监监监监源,在方法返回会返回一个信息象。在.NET中,接口监监监监ISupportErrorInfo的象会监监监自监监监监监监监监监监监监监监映射到的信息和一个.NET异常。
4. 事件理。监监监
.NET用C#监监字event和delegate提供了事件理监监监监监机制。
在COM事件中,件监监监监监监监监必接口IConnectionPointContainer和另一个接口监监监监IConnectionPoint的接监监点监监象(CPO)。件定了一个由监监监监监监监监监CPO监监监监监用的出接口ICompletedEvents。客程序监监监监监监必在sink监监象中监监监监监监监监个出接口,而 sink监象本身是一个COM监监监监监监监监监监监监监监监监监监监监象。在行程中,客程序在服器中接口IConnectionPointContainer。通个接口,客程序监监监监监监监监监监监CPO监行方法FindConnectionPoint(),得指监监监监向所返回的IConnectionPoint的指。客程序再使用个接口指用监监监监监监监监监监监监监监监监监Advise方法,并把指向sink监象的指送监监监监监监监监监监监监监监监监监监监监监监服器。接着,件就可以在客程序的sink监监监监监监监象中用方法了。
如:监监
注:此监监监P679
5. 监监(marshaling)
从.net监监送COM监件和从COM监监监监件送.NET的数据必监监监监监监监监监监监监监监监监相的表示法,个机制也称。监监监监监监监监监监监监监监监监监监监监监监监监监监监监监具体的程取决于所数据的型。里必区分blittable和non-blittable数据型。监监监blittable数据型在监监监.NET和COM中有相同的表示法,不需要。的数据型如监监监监监监监监监监监byte、short、int和long,包含监监监监监监监监监监监监监监监监监监监些数据型的和数都属于blittable数据型。型的数监监监监监监监监监监监监监监监监必是一的。non-blittable数据型需要行。下表监监监监监监监监监监监监监监监监列出了一些non-blittable的COM数据型及其的监监监监监监监.NET数据监监监监监监监监监监监监监监监监监监监型,型需要,所以需要更多的:
6. 在.NET监件中使用COM监件。
监建Runtime Callable Wrapper,RCW,:
命令行方式:tlbimp COMServer.dll /out: Interop.COMServer.dll。注:后面的dll是包装监监监监监程序集。可使用监监/namespace和/asmversion来指定命名空和定程序监监监监监监监监监监监监集的版本号。/keyfile可以把一个名所强监监监生成的程序集。
Visual Studio方式:添加引用————COM——添加。
注意:可以监监监监封装的COM接口行例监监监监监监监监监监化操作。如:
COMDemo obj=new COMDemo(); //COMDemo是一个接口
注:如果在垃圾收集器清理象之前监监监监监监放COM监监监监象,静方法Marshal.ReleaseComObject()就用件的监监监监监Release()方法,件就可以监监监监监监监监监监监监监监监它自己,并毁放内存了。
COM监监象当引用数0监监监监,就会放。Marshal.ReleaseComObject(obj)方法会用监监Release()方法引用数减监监监监监1。RCW监监用一次AdRef()方法,来增引用数,所以无有多少监监监监监监监监监监监监监监RCW的引用,用一次 监监监监Marshal.ReleaseComObject(),就足以监监监监监监放象了。
在使用Marshal.ReleaseComObject()监放COM监监监监监监监监监监监监监监象后,就不能引用量了,否就会生成一个InvalidComObjectException监型的异常。
注意:COM监监监监监监监监象在不再需要就放,因COM监象使用内置的内存堆,而.NET监象使用托管的内存堆。GC只理托管的内存。监监监监监监监监
7. 可交互操作的主程序集:是COM监监监监监监监监监监监监监监监监监监监监监件的供商已准好的程序集,不同于自生成的RCW。可交互操作的主程序集在目监\Microsoft .NET\Primary Interop Assemblies中。它已监监监监监监存在,用于.NET中的ADO。如果添加监COM监Microsoft ActiveX Data Objects 2.7 Library的引用,就不建包监监监监监监装器,因可监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监监交互操作的主程序集已存在,否就引用可交互操作的主程序集。
监监监监程:COM监监监监监监监监监监监监监监监监监监监件根据行的程安全与否,它所在的元 ,STA或MTA,。8. 在COM客程序中使用监监监监监监.NET监件。
必监监监使用COM Callable Wrapper(CCW)。
注:在.NET中,特性[ComVisible(true)]使和接口可用于监监监监监监监COM。
监监监监监建型:tlbexp DotNetComponent.dll。,会建型监监监监监DotNetComponent.tlb,使用用工监监监监具OLE/COM object viewew (oleview32.exe)可以监监监监监监监监看型,位于Microsoft SDK中,可在VS 命令行中个工监监监监监具。,
9. 把命名空监System.Runtime.InteropServices中的特性用于、接口或方法,可以监监监监监监监监监监监监监监监修改CCW的方式。监监监监监10. COM注册。在.NET监件用作COM监监监象之前,需要在注册表中配置它。另外,如果不希望把程序集制到客程序所在的监监监监监监监监监监监监监监监监监监监监监监监监监监监监监目下,需要把程序集安装在全局程序集存中。,要把程序集安装在全局程序集监监监监监监监监监名它,存中,必强用
在全局程序集监监监监监监监监监存中注册程序集:gacutil -i DotNetComponent.dll在注册表中配置件:监监监regasm DotNetComponent.dll /tlb。,监监/tlb可以提取型,在注监监监监监监监监监册表中配置型,监监监监
所有的COM信息都在HKEY_CLASSES_ROOT(HKCR)中。
11. 在IE中运行Windows窗体控件。
Windows窗体控件在IE中可以用作ActiveX控件。Microsoft不支持在任何窗口中包含WIndows窗体控件,支持的窗口只有IE和MFC容器。
要在IE中包含Windows窗体控件,必监监监监监监监监监监把程序集文件制到Web服监监监监监器上,在HTML监监监面添加一些控件的信息。了支持监监监监Windows窗体控件,监监监展