为什么Silverlight程序集与“普通”的.NET程序集不兼容的原因

6

Silverlight程序集与“普通” .NET程序集不具有二进制兼容性。这是怎么回事呢?考虑到这两种程序集都使用了相同的编译器(尽管针对Silverlight没有引用mscorlib.dll),那么它该如何实现呢?


2
什么是“二进制兼容性”? - Rubens Farias
“不二进制兼容”这个短语通常用来描述无法从Silverlight程序集引用“普通”程序集,反之亦然。 - Konstantin
3个回答

9

好的,问题很好。在这个领域有很多误解,重要的是要把事实和虚构分开。

虚构: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、文件、注册表等执行各种恶意操作。我们不能让它们在浏览器中运行。
因此,总结一下:
Silverlight程序集-->在桌面CLR上运行==可行
桌面程序集-->在银光CLR上运行==不可行
如果您想了解一个银光程序集在桌面CLR上运行的真实示例,请查看我一年前的文章@SILVERLIGHT DLLS ON THE DESKTOP CLR

完全同意你的观点,Angel。不过,在编写可重用代码、适用于两个平台的方面,有一些创造性的方法可以尝试。 - Boris Modylevsky
@Boris:是的,正确的方法是在VS中使用链接源文件。这样可以从同一源代码生成两个程序集。 - AnthonyWJones
@Justin: “没错,很好的问题”,但你觉得这样不值得点个赞吗? ;) - AnthonyWJones

0

IL代码是相同的。但是核心库不同,因此即使是为.NET编译的库中的最简单操作在Silverlight中也无法工作,因为该库将引用在Silverlight中不存在的外部库。


这意味着,例如在Silverlight中System.Object可能会有所不同,如果从Silverlight引用.NET类型,则可能会出现无法预测的行为。但是,限制.NET程序集不能从Silverlight程序集中引用被放入IDE中,通过命令行调用csc.exe仍将在此情况下进行编译? - Konstantin
更正确地说,任何.NET程序集都引用mscorlib.dll(至少因为任何类型都继承自System.Object)。但是mscorlib.dll在Silverlight中不可用。我是对的吗? - Konstantin
Silverlight使用的mscorlib版本与完整的.NET使用的版本不同。您说得对,引用限制实际上是IDE强加的。 - AnthonyWJones

0

它们不兼容,因为Silverlight使用轻量级版本的mscorlib.dll。但是,您可以通过一些技巧在Silverlight上重用您写的“普通”.NET的代码。


如果微软没有使用轻量级版本的mscorlib.dll,会发生什么情况呢,休?你认为会怎样? - abmv
如果Silverlight使用“普通”的库集,用户在想要使用基于Silverlight的网站时就必须安装整个.NET Framework。 - Boris Modylevsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接