Azure で実行されている C# Web ロールがあり、C# プロジェクトは、アプリと共にデプロイする F# dll のコードを呼び出します。
ローカル Azure エミュレーターを使用してローカルで実行している場合、F# コードが呼び出され、正常に実行されます。クラウド内の Azure で実行されている場合、F# コードは特定の時点で失敗し、次の例外が発生します。
x の関数の解析に失敗しました: var(2).Exception: System.IO.FileNotFoundException: ファイルまたはアセンブリ 'FSharp.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。ファイル名: 'FSharp.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
at Microsoft.FSharp.Text.Lexing.LexBuffer1.FromArray(char[] s) at Microsoft.FSharp.Text.Lexing.LexBuffer
1.FromString(String s) at Marshal.vars@27.GenerateNext(IEnumerable` 1&次)
WRN: アセンブリ バインディングのログがオフになっています。アセンブリ バインド エラーのログを有効にするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) を 1 に設定します。この機能をオフにするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] を削除します。.デフォルトの機能を使用します。
その理由を示唆するいくつかの投稿を見つけました。
Windows Azure は、アプリケーションの実行をサンドボックス化する一環として、部分信頼でアプリケーションを実行します。ただし、F# コア ライブラリは現在 GAC にインストールされていますが、AllowPartialTrustedCallers 属性はありません。そのため、Azure で実行する F# アプリケーションをビルドする場合、F# ライブラリは --standalone を使用して静的にリンクする必要があります。提供されているテンプレートがこれを処理しますが、次の副作用があることに気付くでしょう: • 通常より長いコンパイル時間 • 大量の参照セット • "RDManaged.dll" へのダミー参照
これを回避するために、以下のアドバイスに従い、–standalone
F# ライブラリのビルド構成にフラグを設定します。
http://www.42spikes.com/post/F-and-Azure.aspx
ただし、F# ライブラリはこのフラグでコンパイルされません。次のビルド エラーが発生します。
エラー 3 バイナリ 'obj\Debug\Analyzer.dll' の書き込み中に問題が発生しました: タイプ Microsoft.FSharp.Text.StructuredFormat.Joint の pass2 でエラーが発生しました: エラー: モジュールの 1 つで、タイプ 'System.Collections.IStructuralEquatable' が発行されるモジュール内で定義されます。入力ファイルが見つからない可能性があります FSC 1 1
アナライザー
このビルド エラーは、F# プロジェクトの依存関係によるものでしょうか? これは、FSharp.PowerPack.dll と Microsoft.Z3.dll、およびソリューションの別の C# ライブラリ、AnalyzerCommon.dll (F# と C# の両方のコードが実装する共通インターフェイスのみを含む) を参照します。
F# コードが呼び出されて正常に実行されるのは興味深いことです。これは、コードの特定の部分 (FSharp.PowerPack.dll を使用する数式パーサー) に到達するまでのみです。
どんなヒントでも大歓迎です。
ありがとう、サム