0

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.LexBuffer 1.FromArray(char[] s) at Microsoft.FSharp.Text.Lexing.LexBuffer1.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" へのダミー参照

http://archive.msdn.microsoft.com/fsharpazure

これを回避するために、以下のアドバイスに従い、–standaloneF# ライブラリのビルド構成にフラグを設定します。

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 を使用する数式パーサー) に到達するまでのみです。

どんなヒントでも大歓迎です。

ありがとう、サム

4

1 に答える 1

3

WebRole アプリケーションで必要なすべてのアセンブリを明示的に参照し、" Copy Local " 属性を " True " に設定する必要があります。この私のブログ投稿をチェックしてください。最初に言及するのは、ローカルのコピーです。

コードの一部が実行され、他の部分が実行されない理由は、JIT コンパイラです。不足しているアセンブリを必要とするコードに到達するまで、すべてが正常に実行されます。必要なすべてのアセンブリを参照として明示的に追加し、「ローカルのコピー」を「True」に設定すると、「ファイルが見つかりません」という例外は発生しません。

役に立ったらフォローお願いします!

編集

Windows Azure は、既定で完全信頼で実行されます。SDK 1.3以降だと思います。これを変更するには、Visual Studio ソリューションのクラウド プロジェクトで Web ロールを右クリックし、[プロパティ] を選択して [構成] に移動し、[完全な信頼] を選択します。

于 2011-11-09T12:34:24.193 に答える