新关键字在c#中的工作原理

时间:2009-03-07 09:15:51

标签: c# .net c++

有一个编译成dll的类

//HeaderFile.h 
//version 1.0
class __declspec(dllexport) A {
    int variable;
//member functions omitted for clarity
};

//implementation file omitted for clarity

你构建了一个exe,它使用上面编译的dll中的类

#include "HeaderFile.h"
int main() {
    A *obj = new A();
    obj->CallSomeFuncOnObj();

    //
    //whatever
    //
}

直到现在你的程序运行正常。但现在您使用以下代码重新编译您的dll

//HeaderFile.h
//version 2.0
class __declspec(dllexport) A {
    int variable;
    int anotherVariable;
//member functions omitted for clarity
};

//implementation file omitted for clarity

并且你不重新编译你的exe 但是开始使用旧exe中重新编译的dll。现在会发生的是你的exe有代码将分配memory = sizeof(A类1.0版),但新dll中的构造函数有代码假定它正在传递一个内存块= sizeof(A类2.0版)。这两者之间存在一个整数值差异 - 这是一种不可预测性的方法。

一本类似的例子显示在一本优秀书籍的第一章--Don Box的Essential COM。现在提出问题。在c#(或任何其他.Net语言)的类似情况下会发生什么?

1 个答案:

答案 0 :(得分:2)

在COM中,您的DLL实现了一个对象工厂:DLL创建对象本身以避免这种“同步”问题。在.NET中,CLR基于从实现类型的DLL中提取的类型知识来实例化对象。在这两种情况下,都避免了你提到的问题。