有一个编译成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语言)的类似情况下会发生什么?
答案 0 :(得分:2)
在COM中,您的DLL实现了一个对象工厂:DLL创建对象本身以避免这种“同步”问题。在.NET中,CLR基于从实现类型的DLL中提取的类型知识来实例化对象。在这两种情况下,都避免了你提到的问题。