【问题标题】:Referencing a 64bit dll in the web app of a WCF RIA Services app hosted in Azure在 Azure 中托管的 WCF RIA 服务应用程序的 Web 应用程序中引用 64 位 dll
【发布时间】:2011-08-24 00:39:13
【问题描述】:

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

Web 应用引用 Microsoft Z3 dll:

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

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

关于哪种方法最好以及如何使用的任何提示?

谢谢

山姆

【问题讨论】:

    标签: silverlight azure wcf-ria-services z3


    【解决方案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 语句来解决。

    【讨论】:

    • 只是补充一点,我不会在我的项目中放入任何 zip/exe/installables 并成为我部署的一部分。我宁愿将它们放在 Blob 存储中,并使用 Azure Bootstrapper (bootstrap.codeplex.com) 从启动任务中下载/解压缩/安装。
    【解决方案2】:

    我们正在努力使 Z3 在 Azure 上可用于一般其他 Web 服务。这正在积极开发中,但尚未上线。我们预计许多其他 Web 服务也将希望使用此功能,这就是为什么我会对您对服务接口的要求非常感兴趣的原因。您需要一个增量的、高性能的界面,还是一个简单的文本文件界面足以满足您的应用程序?

    【讨论】:

    • 嗨@Christoph 你已经到了你在Azure中托管Z3的阶段了吗?您是否必须在 Azure 服务器上安装 Z3 msi 才能使其正常工作?顺便说一句,Z3 msi 是否注册了任何 COM 组件?我在尝试让 Microsoft.z3.dll 在 Azure 中加载并尝试各种方法让它访问 z3.dll 时遇到了很多麻烦。干杯
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-14
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 2012-11-29
      • 2017-01-20
      相关资源
      最近更新 更多