1

我有一个使用 WCF RIA 服务并托管在 Azure 中的 Silverlight 应用程序。

Web 应用程序引用 Microsoft Z3 dll:

如果我引用此 dll 的 32 位版本,Azure 无法托管它,因为它需要 64 位版本。如果我引用 64 位版本,RIA 服务将无法编译。

我需要找到一种在 Azure 中使用 32 位 dll 的方法,或者我需要找到一种为 RIA 服务引用 63 位 dll 的方法。

关于哪个是最好的方法以及如何做的任何提示?

谢谢

山姆

4

3 回答 3

1

我想我会很快分享我的方法,以防有人需要再次这样做或类似的事情,因为这些问题对于 Azure 中的其他本机 C++ 库来说很常见。

问题与许多事情有关:Azure 没有 Z3 所需的所有 VC++ 运行时 dll;Z3 安装不包括其 bin 中的其他依赖项;如果解决方案或 bin 文件夹中有任何 64 位 dll,Silverlight RIA 服务将无法编译;Azure 未运行 32 位版本的 Z3 dll;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. 创建一个 Azure 启动任务,在首次部署时静默安装 VC++ redist。

  7. 在角色配置中创建 Azure 本地存储资源

  8. 在启动时,将 zip 解压缩到本地存储(如果它不存在)

  9. 使用 MEF(托管可扩展性框架)通过使用指向本地存储的 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

解决此问题的一种方法是在 Azure 上启用 32 位二进制文​​件。这可以通过运行来完成:

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

在启动时。这可以通过在服务定义中添加启动任务以在 cmd 脚本中运行来指定。

于 2013-09-23T14:53:19.657 回答