Effecitve C# 原则46:最小化与其它非托管代码的交互
2009-02-19 08:17:24 来源:WEB开发网现在让我们转到如何在托管的非托管组件中转移程序控制。你有三种选择:COM交互,平台调用(P/Invoke),以及托管C++。每种方法有它自己的优势和劣势。
COM交互是最简单的方法来使用已经存在的COM组件。但COM交互也是在.Net中和本地代码交互时最低效的一种方式。除非你的COM组件已经有很重要的利益,否则不要这样做。不要看也不要想这种方式。如果你没有COM组件而要使用这种方法就意味着你要把COM和交互原则学的一样好。没时间让你开始理解IUnknown(译注:COM原理中最基本的接口,任何COM都实现了这样的接口)。那些这样做的人都试着从我们的内存中尽快的清理它们。使用COM交互同样意味着在运行时你要为COM子系统承担开销。你同样还要考虑,在不同的CLR对象的生命期管理和COM版本的对象生命期管理之间又意味看什么。你可以服从CLR的原则,这就是说做一个你所导入的COM对象有一个析构函数,也就是在COM接口上调用的Release()。或者你可以自己清楚的使用ReleaseCOMObject()来释放COM对象。第一种方法会给应用程序引入运行时的低效(参见原则15)。而第二个在你的程序里又是头疼的事。使用ReleaseCOMObject ()就意味看你要深入到管理细节上,而这些CLR的COM交互已经帮我们完成了。你已经了解了,而且你认你明白最好的。CLR请求所有不同,而且它要释放COM对象,除非你正确的告诉它,你已经完成了。这是一个极大的鬼计,因为COM专家程序员都是在每个接口上调用Release(),而你的托管代码是以对象处理的。简单的说,你必须知道什么接口已经在对象上添加了AddRef,而且只释放这些(译注:COM的引用非常严格,每个引用都会添加一个AddRef,释放时必须明确的给出Release(),而且必须成对使用,而在.Net对COM进行封装后,很多时候就是这个引用不匹配而出现资源泄漏)。就让CLR来管理COM的生命期,你来承担性能损失就行了。你是一个烦忙的开发人员,想在.Net中混合COM资源到托管环境里,你要学习的太多了(也就是第三个开销)。
更多精彩
赞助商链接