Silverlight程序集与“普通” .NET程序集不具有二进制兼容性。这是怎么回事呢?考虑到这两种程序集都使用了相同的编译器(尽管针对Silverlight没有引用mscorlib.dll),那么它该如何实现呢?
Silverlight程序集与“普通” .NET程序集不具有二进制兼容性。这是怎么回事呢?考虑到这两种程序集都使用了相同的编译器(尽管针对Silverlight没有引用mscorlib.dll),那么它该如何实现呢?
好的,问题很好。在这个领域有很多误解,重要的是要把事实和虚构分开。
虚构:Silverlight程序集由神奇的微软地精编译,这使它们与.Net桌面CLR不兼容。
事实:CLR有一个美妙的系统叫做“Fusion”。
每个程序集都有一个嵌入在DLL/EXE中的程序集清单。
程序集清单包含一些内容(嵌入资源的名称、类型系统信息等),还包括此程序集所需的其他程序集。
Fusion是CLR的一部分,负责获取程序集清单依赖项并查找相应的物理文件。
对于桌面.Net CLR上的Silverlight程序集,Fusion可以正常工作(假设所有依赖项都存在)。
银光CLR上的融合桌面程序集-无法工作。主要是因为.Net BCL(基类库)DLL不存在。正如所提到的,这是不同的mscorlib.dll、agcorlib.dll、System.dll、System.Windows.dll等等。这些DLL之所以不同,主要是出于安全考虑。正常的BCL会通过指针、特定于平台的p/invokes、文件、注册表等执行各种恶意操作。我们不能让它们在浏览器中运行。IL代码是相同的。但是核心库不同,因此即使是为.NET编译的库中的最简单操作在Silverlight中也无法工作,因为该库将引用在Silverlight中不存在的外部库。
它们不兼容,因为Silverlight使用轻量级版本的mscorlib.dll。但是,您可以通过一些技巧在Silverlight上重用您写的“普通”.NET的代码。