11

F# からコードをコンパイルして Silverlight で使用しようとしています。私はコンパイルします:

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

これにより、SL フレームワークを参照するスタンドアロン アセンブリが生成されます。しかし、生成されたアセンブリへの参照を追加しようとすると、次のエラーが発生します。

ソリューション内の他の Silverlight プロジェクトへのプロジェクト参照のみを追加できます。

これが Silverlight アセンブリではないことを確認するために、VS プラグインは何をしていますか? マニフェストは次のとおりです。

// 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 の何かが好きではありません。それらは永続可能ですが、そこにある何かが拒絶を引き起こしています.

4

2 に答える 2

7

答え!

どうやら問題は、bin\Release または bin\Debug への参照を追加すると、Visual Studio (または Silverlight プロジェクト システム) がプロジェクトを参照しようとすることです。これは何らかの理由で失敗します。

F# 出力 DLL を別の場所にコピーすると、参照は正常に行われます。(もちろん、これはプロジェクト参照ではなく、ファイル参照になります。)

次に、F# ライブラリが最初にビルドされるように依存関係をセットアップします。その後、ファイル参照を使用して F# で生成されたバイナリを取得できます。

更新:もう 1 つの明らかな問題。コードの最適化をオンにすると、次のエラーが発生します。

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'

最適化されたコードをオフにしておくと、これはなくなり、すべて正常に動作します。

于 2008-10-28T22:27:05.613 に答える
0

Visual Studioは、Microsoft.VisualStudio.Silverlight.SLUtilタイプのIsSilverlightAssembly()関数を使用して、参照を設定できるかどうかを確認します。

David Betzは、ここで詳細を説明する素晴らしいブログ投稿をしています。

于 2009-01-22T12:13:39.120 に答える