Silverlight如何确定一个程序集是“Silverlight”?

11

我正尝试将F#代码编译为Silverlight使用。我使用以下命令进行编译:

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

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

You can only add project references to other Silverlight projects in the solution.

VS插件是如何确定这不是Silverlight程序集的?这里是清单(manifest):

// 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。我甚至向“SL库”DLL添加了不可验证的IL,它仍然可以加载。

有什么建议吗?

更新:我做了一些探索,似乎不是清单很重要。它不喜欢FSharp库中的IL中的某些内容。它们是peverifiable的,但其中的某些内容触发了拒绝。


如果您有答案,请不要忘记与我们分享。我也想知道这个问题的答案。谢谢! - chakrit
如果我弄清楚了,我一定会发布的 :P - MichaelGG
2个回答

7

答案!

显然问题在于当您向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'

如果我关闭优化代码,这个问题就会消失,一切都能正常工作。

我迫不及待地想试一试! - Brian Leahy

0

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

David Betz有一篇很好的博客文章描述了细节这里


显然,在VS内部它做了更多的事情,因为将文件移出目标位置会使VS将其视为SL程序集——与之前看到的非SL位相同。虽然,也许这是其他逻辑,即“文件引用输出路径->项目引用”。 - MichaelGG

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