动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
   .Net → 阅读文章

 Visual C++ 2005中混合代码的初始化

作者来源: 
阅读 1163 人次 , 2006-4-25 14:58:00 


  在 Visual Studio .NET 2003 中初始化混合DLLs很麻烦,需要手工干预。但在 Visual Studio 2005 中,Visual C++ 和 CLR 团队设计了一种新的初始化模型,这种新模型更简单,更自动化。

  Visual Studio .NET 2003 的根本问题在于将本地代码和托管代码一起置于单“池”中。DllMain 期间该池的运行是不安全的,托管代码根本就不能在这里运行。

  新的模型将静态初始化汇集在两个单独的池中。一个池负责本地的静态初始化;另一个负责托管代码的初始化。

  第一个池在 DllMainCRTStartup 期间进行初始化,就像本地代码那样。第二个池的初始化,我们加入了一个新的托管代码初始化阶段。当某个包含托管代码的模块被加载到应用程序域(AppDomain)时,CLR 将会在任何托管代码运行之前运行一个特殊的.cctor 函数(我们把它叫做“模块构造函数”)。

  托管C运行时(msvcmrt.lib)包含一个模块构造函数,由它负责初始化第二个池。同时它还安装一个应用程序域的 unload 事件来运行托管静态析构函数和 exit 函数。

  这种新模型意味着到托管代码的迁移或添加托管代码到现有的应用程序将变得更加容易,因为不需要再添加定制的初始化入口点。迁移期间,你可能还会碰到本地代码调用托管代码的情况。你的代码要可靠地启动和关闭,必须解决这个问题才行。否则会出现 C 运行时库的R6031错误,或者在调试器下运行时出现 CLR 警告。

  为了在 Visual Studio 2005 Beta 2 或以后的版本中解决这个问题,使用调试器的调用堆栈(call stack)找到此烦人的函数,并将该函数要么移到某个头文件中,或者本地原文件中,以便将它编译成本地代码。你可能注意到了通过 #pragma managed 解决此类问题的建议。请尽量避免这种做法,用这种方法来解决这个问题非常难以凑效。尤其是在你具备自己的 DllMain 或 RawDllMain 时更是如此,此时必须保证将此函数放在本地代码集中。

  如果你采纳了保罗描述的解决方案,从 Visual C++ 7.1 到 8.0 的迁移不会有太多麻烦。当你重新编译时,你会看到关于使用 _vcclrit.h 中函数的不满警告。此时删除对该文件的引用并进行手工初始化即可。为了完全恢复使用CRT,你还应该从编译开关中去掉 /Zl,从链接开关中去掉 /NOENTRY。

  这是 Visual Studio 2005 中大量改动的地方之一,目的是方便将 C++ 应用程序迁移到托管代码使用环境。使用最新的生成产品,我们已经看到大量应用程序在相当短的时间内转移到了托管环境中。Visual Studio 2005 Beta 2 出炉后用用看吧,并把使用情况反馈给我们。
  
 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:C++中回调函数使用的变身大法
· 下一篇:Visual C++.NET编程讲座之七
· .net中窗体的调整
· ASP.NET编程中的十大技巧
· .Net边学边讲(三)
· 在 VS.NET 中编写 Web 应用程序(附图)
· 如何用Visual C#做组件


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077