【问题标题】:How does Silverlight determine an assembly is "Silverlight"?Silverlight 如何确定程序集是“Silverlight”?
【发布时间】:2008-10-25 21:29:37
【问题描述】:

我正在尝试从 F# 编译代码以在 Silverlight 中使用。我编译:

--noframework --cliroot "C:\program Files\Microsoft Silverlight\2.0.31005.0" --standalone

这会生成一个引用 SL 框架的独立程序集。但是当我尝试添加对生成的程序集的引用时,我得到了这个错误:

您只能将项目引用添加到 其他 Silverlight 项目 解决方案。

VS 插件如何确定这不是 Silverlight 程序集?这是清单:

// Metadata version: v2.0.50727
.assembly extern mscorlib
{
  .publickeytoken = (7C EC 85 D7 BE A7 79 8E )                         // |.....y.
  .ver 2:0:5:0
}
.assembly FSSLLibrary1
{

  // --- The following custom attribute is added automatically, do not uncomment -------
  //  .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 ) 

  .hash algorithm 0x00008004
  .ver 0:0:0:0
}
.module 'F#-Module-FSSLLibrary1'
// MVID: {49038883-5D18-7281-A745-038383880349}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003       // WINDOWS_CUI
.corflags 0x00000001    //  ILONLY
// Image base: 0x04120000

我不明白它不喜欢什么;它是纯可验证的 IL。我比较了一个 SL“类库”程序集,它看起来是一样的。唯一的区别是一些属性,但我删除了这些属性,VS 仍然让我引用 DLL。我什至将无法验证的 IL 添加到“SL 库”DLL 中,它仍然加载。

有什么建议吗?

更新:我已经做了一些探索,但它似乎并不重要。它不喜欢 FSharp 库中 IL 中的某些内容。它们是可验证的,但其中的某些东西引发了拒绝。

【问题讨论】:

  • 如果您有答案,请不要忘记与我们分享。我也想知道这个。谢谢!
  • 如果我弄清楚了,我一定会发布它:P

标签: silverlight f# reference


【解决方案1】:

回答!

显然问题在于,当您添加对 bin\Release 或 bin\Debug 的引用时,Visual Studio(或 Silverlight 项目系统)决定尝试引用该项目。无论出于何种原因,这都会失败。

如果您将 F# 输出 DLL 复制到另一个位置,则引用会正常进行。 (当然,这将是文件引用,而不是项目引用。)

然后设置依赖项,以便首先构建 F# 库,然后您可以使用文件引用来获取 F# 生成的二进制文件。

更新:一个更明显的问题。如果我打开优化代码,则会收到此错误:

C:\test\SilverlightApplication1\FSC(0,0): error FS0193: internal error: the module/namespace 'System' from compilation unit 'mscorlib' did not contain the namespace, module or type 'MarshalByRefObject'

如果我关闭优化代码,它就会消失,一切正常。

【讨论】:

  • 我迫不及待想试一试!
【解决方案2】:

Visual Studio 使用 Microsoft.VisualStudio.Silverlight.SLUtil 类型中的 IsSilverlightAssembly() 函数来检查是否可以设置引用。

David Betz 有一篇很好的博文描述了详细信息 here

【讨论】:

  • 显然它比 VS 内部做的要多一点,因为将文件移出目标位置会使 VS 将其视为 SL 程序集——与之前看到的非 SL 相同的位。虽然,也许这是其他逻辑说“输出路径的文件引用 -> 项目引用”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多