1

WCF RIA サービスを使用し、Azure でホストされている Silverlight アプリがあります。

Web アプリは Microsoft Z3 dll を参照します。

この dll の 32 ビット バージョンを参照すると、64 ビット バージョンが必要なため、Azure はそれをホストできません。64 ビット バージョンを参照すると、RIA サービスがコンパイルされません。

Azure で 32 ビット dll を使用する方法を見つけるか、RIA サービス用の 63 ビット dll を参照する方法を見つける必要があります。

どのアプローチが最適で、どのように行うかについてのヒントはありますか?

ありがとう

サム

4

3 に答える 3

1

問題は Azure の他のネイティブ C++ ライブラリに共通しているため、誰かがそれを行う必要がある場合、または同様のことを再度行う必要がある場合に備えて、私のアプローチをすぐに共有すると思いました。

問題は、多くのことに関係していました。Azure には、Z3 に必要なすべての VC++ ランタイム dll がありません。ビンに他の依存関係を含まない Z3 インストール。ソリューションまたは bin フォルダーに 64 ビット dll があると、Silverlight RIA サービスがコンパイルに失敗します。Azure は Z3 dll の 32 ビット バージョンを実行していません。Azure に F# ランタイムがないなど。

これが私がそれを機能させた方法です:

  1. Z3 を呼び出すコードのインターフェイスを抽象化します (私の場合、XxxAnalyzerCommon.dll に IXxxAnalyzer インターフェイスがあります)。

  2. このインターフェイスの具体的な F# 実装を、参照、コンテンツ、またはリソースとしてソリューションに直接追加しないでください。

  3. 代わりに、.NET zip ライブラリを使用してパッケージ化します。

     a. XxxAnalyzer64.dll  (64bit version of the F# implementation of IXxxAnalyzer)
    
     b. XxxAnalyzerCommon.dll
    
     c. FSharp.Core.dll
    
     d. FSharp.PowerPack.dll
    
     e. Microsoft.Z3.dll (64bit version)
    
  4. zip をコンテンツとして Web プロジェクトに追加する

  5. VC++ 再頒布可能 (64 ビット) vcredist_x64.exe をコンテンツとして Web プロジェクトに追加します。

  6. 最初のデプロイ時に VC++ redist をサイレント インストールする Azure スタートアップ タスクを作成します。

  7. ロール構成で Azure ローカル ストレージ リソースを作成する

  8. 起動時に、ローカル ストレージに zip を展開します (まだそこにない場合)。

  9. MEF (Managed Extensibility Framework) を使用して、ローカル ストレージを指す DirectoryCatalog を使用して具体的な IAnalyzer を動的にインポートします。そのため、プロジェクトは XxxAnalyzer64.dll を直接参照したり依存したりする必要はありません。

また、FSharp.PowerPack.dll が以前のバージョンの FSharp.Core.dll を強く参照しているという問題もありました。この問題を解決するには、web.config で Assembly Redirect ステートメントを使用する必要がありました。

于 2011-12-01T10:59:06.353 に答える
0

Z3 を Azure で他の Web サービス全般に利用できるようにする取り組みがあります。これは活発に開発されていますが、まだ公開されていません。他の多くの Web サービスもこの機能を使用したいと考えているため、サービスへのインターフェースに関する要件に非常に関心があります。インクリメンタルで高性能なインターフェイスが必要ですか、それとも単純なテキスト ファイル インターフェイスで十分ですか?

于 2011-08-26T12:39:57.447 に答える
0

これを回避する 1 つの方法は、Azure で 32 ビット バイナリを有効にすることです。これは、次を実行することで実行できます。

%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.enable32BitAppOnWin64:true

始めるとき。これを指定するには、サービス定義にスタートアップ タスクを追加して、cmd スクリプトでこれを実行します。

于 2013-09-23T14:53:19.657 に答える