网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > C# > 正文
.NET 组件中的线程辅助
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/14
下载{$ArticleTitle}原创论文样式

   在Understanding COM Threading Models and Apartments from a .NET Application''s perspective 这一章,你知道在创建经典COM组件之前,.NET 应用程序是怎样宣告调用线程单元辅助 。现在看一下等式的另一方面。尤其是当从非托管 COM感知应用程序创建了.NET 组件 时,.NET组件 的线程辅助被文本定义,而对象就处在这个文本中。本质上来说,一个Context就是AppDomain(轻型过程)拥有的环境 ,而对象就是在AppDomain 中创建的。每一个文本都依次拥有对象,这些对象享用公共的使用要求,例如:线程辅助、对象池化、 交易、 JIT 激活、同步等。当依靠属性的执行时要求时,而且对象也要求中断服务时,就会创建这些文本。如果这里有一个文本,此嗯本与使用规则相匹配,然后执行时就会在那个文本中提供调节。如果它没有找到一个相匹配的文本,就会为对象创建一个新文本。

    前面说到,每一个AppDomain都有一个默认文本。默认文本.依次拥有Context Agnostic (Context Agile)对象。这些对象没有绑定到任何文本。Context Agile 对象不要求任何属性,特殊使用规则以及中断服务。让我们看一下下面的表格,此表格总结了基于它们自己文本敏捷度的跨文本访问方案中.NET 组件是怎样执行的



被非托管COM 感知客户端访问时的线程中立行为

    当一个程序集经过REGASM.EXE,想为COM 感知客户端创建正确的注册途径时,.NET组件是怎样把它的线程模式转到COM的。

InprocServer32下面的ThreadingModel钥有一个''Both''值。在Classic COM中,把它们的ThreadingModel作为''Both''的对象,期望移到它们的呼叫者单元,此呼叫者单元可以是STA或者MTA。除此以外,''Both''线程对象也集合自由线程封送拆收器,给被它们封送拆收事物提供单元,也集合直接接口指针引用,以此反对代理。Context Agile .NET 组件(不是从ContextBound对象扩展而来的)与中立线程COM对象相似,此中立线程COM对象集合自由线程封送拆收器。当我们通过非托管客户端中的COM 单元将接口引用传输到.NET组件时,.NET组件是怎样运行的。让我们看一下这个简单的C#类型:将向非托管 COM客户端展示这个C#类型:
using System; using System.Runtime.InteropServices; public interface IHelloDotNet { String GetThreadID(); }/* end interface IHelloDotNet */ [ClassInterface(ClassInterfaceType.None)] public class HelloDotNet : IHelloDotNet { public HelloDotNet() { } public String GetThreadID() { return AppDomain.GetCurrentThreadId().ToString(); } }/* end class HelloDotNet */

上面的类型执行来自于IHelloDotNet接口的GetThreadID方法。这个方法返回当前线程的ID,此当前线程正将AppDomain运行到这个对象下载的事物里。为了把上面的类型建成一个程序集,为COM创建正确注册途径,从命令行中执行下列命令。

csc /target:library /out:HelloDotNet.dll HelloDotNet.cs regasm HelloDotNet.dll /tlb:HelloDotNet.tlb

现在继续使用来自于COM 感知客户端的.NET组件。我们将使用一个C++ 控制台应用程序,此C++ 控制台应用程序将在它的主线程 (一个STA)中创建.NET组件,然后通过生成其它两个背景工作执行绪,把它传送到另外两个单元(一个 STA 单元 和一个 MTA 单元)。让我们看一下:当使用显式线程间封送拆收调用(此调用使用CoMarshalInterface/CoUnmarshalInterface API家族)时,什么时候被封送拆收的引用将在单元传输。看一下下面的代码(为了简洁,省略了代码中的错误检查)。
Collapse . #import "mscorlib.tlb" // 导入 .NET 组件 #import "HelloDotNet.tlb" no_name

  • 上一篇资讯: 内存映射文件
  • 下一篇资讯: Unity的属性注入
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号