我有一个使用 WCF RIA 服务并托管在 Azure 中的 Silverlight 应用程序。
Web 应用程序引用 Microsoft Z3 dll:
如果我引用此 dll 的 32 位版本,Azure 无法托管它,因为它需要 64 位版本。如果我引用 64 位版本,RIA 服务将无法编译。
我需要找到一种在 Azure 中使用 32 位 dll 的方法,或者我需要找到一种为 RIA 服务引用 63 位 dll 的方法。
关于哪个是最好的方法以及如何做的任何提示?
谢谢
山姆
我有一个使用 WCF RIA 服务并托管在 Azure 中的 Silverlight 应用程序。
Web 应用程序引用 Microsoft Z3 dll:
如果我引用此 dll 的 32 位版本,Azure 无法托管它,因为它需要 64 位版本。如果我引用 64 位版本,RIA 服务将无法编译。
我需要找到一种在 Azure 中使用 32 位 dll 的方法,或者我需要找到一种为 RIA 服务引用 63 位 dll 的方法。
关于哪个是最好的方法以及如何做的任何提示?
谢谢
山姆
我想我会很快分享我的方法,以防有人需要再次这样做或类似的事情,因为这些问题对于 Azure 中的其他本机 C++ 库来说很常见。
问题与许多事情有关:Azure 没有 Z3 所需的所有 VC++ 运行时 dll;Z3 安装不包括其 bin 中的其他依赖项;如果解决方案或 bin 文件夹中有任何 64 位 dll,Silverlight RIA 服务将无法编译;Azure 未运行 32 位版本的 Z3 dll;Azure 没有 F# 运行时等。
这就是我的工作方式:
为调用 Z3 的代码抽象出一个接口(在我的例子中,在 XxxAnalyzerCommon.dll 中有一个 IXxxAnalyzer 接口)
不要将此接口的具体 F# 实现作为引用、内容或资源直接添加到解决方案中。
相反,使用 .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)
将 zip 作为内容添加到 Web 项目
将 VC++ 可再发行(64 位)vcredist_x64.exe 作为内容添加到 Web 项目
创建一个 Azure 启动任务,在首次部署时静默安装 VC++ redist。
在角色配置中创建 Azure 本地存储资源
在启动时,将 zip 解压缩到本地存储(如果它不存在)
使用 MEF(托管可扩展性框架)通过使用指向本地存储的 DirectoryCatalog 动态导入具体的 IAnalyzer,因此项目不需要对 XxxAnalyzer64.dll 有任何直接引用或依赖。
FSharp.PowerPack.dll 强烈引用早期版本的 FSharp.Core.dll 也存在问题,我必须在 web.config 中使用 Assembly Redirect 语句来解决。
总体上努力使 Z3 在 Azure 上可用于其他 Web 服务。这正在积极开发中,但尚未上线。我们预计许多其他 Web 服务也将希望使用此功能,这就是为什么我会对您对服务接口的要求非常感兴趣的原因。您需要一个增量的、高性能的界面,还是一个简单的文本文件界面足以满足您的应用程序?
解决此问题的一种方法是在 Azure 上启用 32 位二进制文件。这可以通过运行来完成:
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.enable32BitAppOnWin64:true
在启动时。这可以通过在服务定义中添加启动任务以在 cmd 脚本中运行来指定。