二进制:探讨二进制兼容性



\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">面向组件设计中个核心原则就是客户端和服务器端的间 2进制兼容性 2进制兼容性使 2进制化组件得以实现其要求双方组件都必须遵守个共同约定(\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">比方说个接口)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">由于新版本服务端依然遵守双方原始约定客户端不会受到服务端变化带来影响COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">是第项真正摆脱DLL Hell\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">并提供 2进制兼容型组件技术许多开发者都将COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">对 2进制兼容型实现(\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">包括其规定些限制比如可变COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">接口)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">视为这个原则本身然而.NET\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">以另种途径实现了 2进制兼容型模型关联(implications of the programming model)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">想要了解这些关联以及其和COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">区别的处这部分内容将会首先简短介绍COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">

对 2进制兼容性实现接下来再讨论
.NET\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">对 2进制兼容性支持



COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\"> 2进制兼容性



COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">通过使用接口指针(erface poer)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">和虚(virtual table)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">来提供 2进制兼容性COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">中客户端间接地通过个接口指针来访问对象接口指针实际指向另个被称作虚标指针指针表指针指向指针列表这张表每个元素都指向个和接口相对应思路方法地址


\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">当客户使用接口指针某个思路方法时候

(
\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">比如此接口第 2个思路方法)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">所有编译器都会将这段代码编译成个跳转指令跳转到虚表中第 2个入口地址实际上这个地址是通过相对于表头偏移量给出在运行时加载器会给这段指令填补上实际入口地址此时加载器已经知道了表内存地址所有COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">客户端记录都是相对于表头偏移量在运行时任何具备相同表布局(\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">即表指向地址和实际入口地址)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">服务端都应当具有 2进制兼容性这些正是COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">实现接口方式这个模型表达了COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">著名基本原则:你不可以改变已经发布接口!任何对虚改变都会破坏已经存在客户端代码布局必须和接口定义保持举例来说接口中第 2个也是虚标中第 2个入口地址任何对接口定义改变都将导致对所有客户端重新编译并重新配置;否则客户端和服务器便无法实现 2进制兼容了





.NET\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\"> 2进制兼容性



.NET\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">使用元数据来实现 2进制兼容性高级客户端代码

(
\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">比如C# \'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">或 Visual Basic 2005)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">被编译成IL\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">客户端代码不能包含任何有关内存地址偏移量偏移量是根据及时编译器对本地语言组织方式给出在运行时及时编译器将IL\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">编译并链接为本地语言原始IL\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">仅仅包含了思路方法或是访问字段请求并且是基于元数据这好比IL\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">只包含思路方法记号而不是传统意义上直接用本地指令思路方法在元数据中任何个提供思路方法和字段类型都具有 2进制兼容性类型在内存中分布方式是由及时编译其在运行中决定而这切和客户端[Page]IL\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">无关



.NET\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">中基于元数据 2进制兼容性最大好处在于每个类都是个 2进制组件(binary component)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">这样COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">相比开发组件被大大简化了ATL\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">这样复杂框架便不再需要了

.NET
\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">填补了传统面向组件编成所要求窍门技巧和大多数员的间技术缺口如果你只明白面向对象设计依靠.NET\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">对 2进制兼容性和版本管理你仍能获得许多面向组件编成带来益处如果你了解面向组件编成核心内容借助面向组件编成带来种种益处你可以最大化你产出能力和潜能COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">区别.NET\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\"> 2进制兼容性并不仅仅限于基于借口设计任何.NET\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">类型无论它是类或结构都和它客户端兼容任何入口点无论它是个例子思路方法对象字段或是静态思路方法都具有 2进制兼容性基于元数据 2进制兼容性另个主要益处在于你可以同时兼备晚捆绑(late binding)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">灵活性和早捆绑(early binding)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">安全性代码决不会跳转到地址并且你也不需要在客户端中掺入实际入口地址或是偏移量的类代码考虑下面这个.NET\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin\">接口例子:



public erface IMyInterface

{

void Method1( );



void Method2( );


}



\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">这个接口在个服务端集中被定义并实现客户端寄居在另集中客户端应用根据接口定义被编译编译器将通过强制参数类型和返回值类型来保证类型安全性然而即使你改变接口中思路方法顺序客户端仍可以正常工作(\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">无需重编译)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">:



public erface IMyInterface

{

void Method2( );

void Method1( );

}



\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">或添加新思路方法:





public erface IMyInterface


{

void Method3( );

void Method1( );

void Method2( );

}



\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">如果客户端不再使用某个思路方法你可以删除它客户端不会被影响在过去这种灵活性只在些晚绑定脚本语言上可以实现这些语言通过解释而非编译执行而所有这切在COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">接口中都是禁止和不可改变接口基本原则相抵触COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">中定义新接口主要原因是需要增加新思路方法(\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">这也导致COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">模型复杂化)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">可是.NET\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">却能允许你移除不使用思路方法增加新思路方法(

\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">或字段)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">以及改变思路方法顺序[Page](\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">尽管无法改变思路方法参数和那些客户要使用思路方法)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">





\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\"> 2进制继承(Binary Inheritance)



\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">基于元数据 2进制兼容性也带来个有趣负面效应:对实现 2进制继承在传统面向对象设计中子类开发者必须要访问描述基类源文件从而派生出子类.NET\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">中类型由元数据描述所以开发者只需要访问基类元数据即可编译器通过读取 2进制文件元数据以得知基类中可用字段和思路方法实际上即使基类和子类定义在同个工程的下编译其仍然使用元数据来编译子类这也就是在.NET\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">中声明类先后顺序不造成任何影响原因(C\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">中就区别了C\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">

通常要求在使用类型前必须先声明以及包含头文件要有定顺序
)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">.NET\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">所有未封装框架类都可以通过 2进制继承来派生和扩展可是请注意继承是把双刃剑继承是白盒重用(white-box reuse)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">种形式:它会增加基类和子类耦合程度而且需要对基类功能有熟悉了解COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">没有允许对实现 2进制继承(\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">只能对接口)\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">其部分原因就是COM\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">构架师意识到了这些不利原因.NET\'; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin\">则希望通过支持继承来跨过技术缺口可是我强烈建议切勿滥用继承尽可能使类继承关系保持简单独立并尽可能多地使用基于接口设计

Tags:  二进制数的12 十进制转二进制 二进制转换 二进制

延伸阅读

最新评论

发表评论