【问题标题】:The reason why Silverlight assembly is not binary compatible with "normal" .NET assembliesSilverlight 程序集与“普通”.NET 程序集二进制不兼容的原因
【发布时间】:2009-11-16 22:24:09
【问题描述】:

Silverlight 程序集与“普通”.NET 程序集二进制不兼容。考虑到相同的编译器用于创建两种类型的程序集(即使 Silverlight 没有引用 mscorlib.dll),这怎么可能?

【问题讨论】:

  • “二进制兼容”是什么意思?
  • “二进制不兼容”短语通常用于描述您不能从 Silverlight 程序集引用“正常”程序集的事实,反之亦然。

标签: silverlight


【解决方案1】:

好的,好问题。 在这方面存在很多误解,将事实与虚构区分开来很重要。

虚构: Silverlight 程序集由神奇的 microsoft gnome 编译,这使得它们无法与 .Net 桌面 CLR 兼容。

事实:CLR 有这个被称为“Fusion”的精美系统。
每个程序集都有一个作为 DLL/EXE 一部分嵌入的程序集清单。
程序集清单包含一堆东西(嵌入资源的名称、类型系统信息等)以及此程序集所需的其他程序集。

Fusion 是 CLR 的一部分,负责获取该 Assembly Manifest 依赖项并查找相应的物理文件。

桌面 .Net CLR 上 Silverlight 程序集的 Fusion - 可以正常工作。 (假设所有依赖项都存在)

用于桌面程序集的 Silverlight CLR 上的 Fusion - 不起作用。
主要是因为 .Net BCL(基类库)DLL 不存在。如前所述,它是不同的 mscorlib.dll、agcorlib.dll、System.dll、System.Windows.dll 等。
这些 DLL 不同的原因是主要是安全性。普通的 BCL 会使用指针、特定于平台的 p/invokes、文件、注册表等各种令人讨厌的东西。我们不能只运行浏览器。

所以,总结一下:
Silverlight 组件 --> 在桌面 CLR 上运行 == Works
桌面程序集 --> 在 Silverlight CLR 上运行 == 不起作用

如果您想要在桌面 CLR 上运行的 Silverlight 程序集的真实示例,请查看我一年前的文章 @SILVERLIGHT DLLS ON THE DESKTOP CLR

【讨论】:

  • 完全同意你的观点,Angel,但是有一些创造性的方法可以编写可在两个平台上运行的可重用代码。
  • @Boris:是的,正确的方法是在 VS 中使用链接的源文件。从而从相同的源代码生成两个程序集。
  • @Justin:“是的,所以,好问题”,但还不足以让你投赞成票吗? ;)
【解决方案2】:

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

【讨论】:

  • 这可能意味着,例如在 Silverlight 中 System.Object 可能不同,如果从 Silverlight 引用 .NET 类型,则可能会出现无法预料的行为。但是限制,不能从 Silverlight 程序集引用 .NET 程序集被放入 IDE 并且在这种情况下在命令行中调用 csc.exe 仍然可以编译?
  • 更正确的说法可能是任何 .NET 程序集都引用 mscorlib.dll(至少因为任何类型都继承自 System.Object)。但 mscorlib.dll 不适用于 Silverlight。我说的对吗?
  • SL 使用的 mscorlib 版本与完整 .NET 使用的版本不同。您是正确的,引用限制实际上是 IDE 施加的限制。
【解决方案3】:

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

【讨论】:

  • 如果微软没有让它使用 mscorlib.dll 休的轻量级版本怎么办?你会怎么做?
  • 如果 Silverlight 使用“正常”的库集,当用户想要使用基于 Silverlight 的网站时,他们必须安装整个 .NET Framework。
猜你喜欢
  • 2018-11-19
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多