Silverlightは、アセンブリが“ Silverlight”であるとどのように判断しますか?
-
04-07-2019 - |
質問
Silverlightで使用するF#のコードをコンパイルしようとしています。コンパイル:
-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を参照させました。検証不可能なILを「SLライブラリ」に追加しました。 DLLとそれはまだロードされています。
提案はありますか
更新:いろいろ調べてみましたが、重要なのはマニフェストではないようです。 FSharpライブラリのILにあるものは好きではありません。彼らは怒りっぽいですが、そこにある何かが拒絶を引き起こしています。
解決
回答!
明らかに問題は、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'
最適化されたコードをオフにしておくと、これはなくなり、すべて正常に動作します。
他のヒント
Visual Studioは、Microsoft.VisualStudio.Silverlight.SLUtil型のIsSilverlightAssembly()関数を使用して、参照を設定できるかどうかを確認します。
David Betzには、ここで詳細を説明する素晴らしいブログ投稿があります。 。