在 Azure 中托管的 WCF RIA 服务应用程序的 Web 应用程序中引用 64 位 dll

发布于 2024-11-30 20:31:52 字数 312 浏览 2 评论 0原文

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

Web 应用程序引用 Microsoft Z3 dll:

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

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

关于哪种方法是最好的方法以及如何进行有什么建议吗?

谢谢萨姆

I have a Silverlight app that uses WCF RIA Services and is hosted in Azure.

The web app references Microsoft Z3 dll:

If I reference the 32bit version of this dll, Azure can't host it because it needs the 64bit version.
If I reference the 64bit version, RIA Services won't compile.

Either I need to find a way of using the 32bit dll in Azure, or I need to find a way to reference the 63bit dll for RIA Services.

Any tips on which is the best approach and how?

Thanks

Sam

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

最初的梦 2024-12-07 20:31:52

我想我会快速分享我的方法,以防有人需要再次执行此操作或类似操作,因为这些问题对于 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 库来打包:

    <前><代码> XxxAnalyzer64.dll(IXxxAnalyzer 的 F# 实现的 64 位版本)

    b. XxxAnalyzerCommon.dll

    c. FSharp.Core.dll

    d. FSharp.PowerPack.dll

    e. Microsoft.Z3.dll(64位版本)

  4. 将 zip 作为内容添加到 Web 项目

  5. 添加 VC++可再发行组件(64 位)vcredist_x64.exe 作为 Web 项目的内容

  6. 创建首次部署时以静默方式安装 VC++ redist 的 Azure 启动任务。

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

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

    >

  9. 使用 MEF(托管扩展性框架)通过指向本地存储的 DirectoryCatalog 动态导入具体的 IAnalyzer – 这样项目就不会'不需要对 XxxAnalyzer64.dll 有任何直接引用或依赖。

FSharp.PowerPack.dll 强烈引用早期版本的 FSharp.Core.dll 也存在问题,我必须在 web.config 中使用程序集重定向语句来解决该问题。

I thought I would quickly share my approach in case anyone ever needs to do that or something similar again, as the problems will be common to other native C++ libraries in Azure.

The problem was to do with a number of things: Azure not having all the VC++ runtime dlls needed by Z3; the Z3 install not including its other dependencies in its bin; Silverlight RIA Services failing to compile if there are any 64bit dlls either in the solution or in the bin folder; Azure not running the 32bit version of the Z3 dll; Azure not having the F# runtime, etc..

This is how I got it working:

  1. Abstract out an interface for the code that calls Z3 (In my case, having an IXxxAnalyzer interface in XxxAnalyzerCommon.dll)

  2. Don’t add the concrete F# implementation of this interface directly into the solution either as a reference, content, or resource.

  3. Instead, use a .NET zip library to package:

     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. Add the zip as content to the web project

  5. Add the VC++ redistributable (64bit) vcredist_x64.exe as content to the web project

  6. Create an Azure startup task that silently installs the VC++ redist when its first deployed.

  7. Create an Azure Local Storage Resource in your role configuration

  8. At startup, extract the zip to the local storage (if it’s not already there)

  9. Use MEF (the Managed Extensibility Framework) to dynamically import the concrete IAnalyzer by using a DirectoryCatalog pointing at the local storage – so the project doesn’t need to have any direct reference or dependency on XxxAnalyzer64.dll.

There was also a problem with the FSharp.PowerPack.dll strongly referencing an earlier version of FSharp.Core.dll, which I had to use an Assembly Redirect statement in the web.config to resolve.

风尘浪孓 2024-12-07 20:31:52

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

There is an effort to make Z3 available on Azure for other webservices in general. This is in active development, but it's not live yet. We anticpate that many other webservices will also want to use this functionality, which is why I would be very interested in your requirements regarding the interface to the service. Do you require an incremental, high-performance interface or is a simple textual file interface sufficient for your application?

病毒体 2024-12-07 20:31:52

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

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

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

One way around this is to enable 32 bit binaries on Azure. This can be done by running:

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

On startup. This can be specified by adding a startup task in service definitions to run this in a cmd script.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文