代码之家  ›  专栏  ›  技术社区  ›  MichaelGG

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

  •  11
  • MichaelGG  · 技术社区  · 17 年前

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

    --noframework--cliroot“C:\program Files\Microsoft Silverlight \2.0.31005.0”--独立

    这将生成一个引用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中的某些内容。它们是可验证的,但其中的一些东西正在引发拒绝。

    2 回复  |  直到 17 年前
        1
  •  7
  •   MichaelGG    17 年前

    回答!

    显然,问题在于,当您添加对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
  •  0
  •   Maurice    16 年前

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

    大卫·贝茨有一篇很好的博客文章,描述了细节 here .