【问题标题】:Exceptions in F# when running on Azure在 Azure 上运行时 F# 中的异常
【发布时间】:2011-11-09 12:16:55
【问题描述】:

我们有一个在 Azure 中运行的 C# Web 角色,C# 项目调用我们随应用程序部署的 F# dll 中的代码。

当我们使用本地 Azure 模拟器在本地运行时,我们的 F# 代码被调用并且运行良好。当它在云中的 Azure 中运行时,我们的 F# 代码在某个时间点失败,并出现以下异常:

无法解析 x 的函数:var(2).Exception: System.IO.FileNotFoundException:无法加载文件或程序集 'FSharp.Core,版本=2.0.0.0,文化=中性, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。这 系统找不到指定的文件。文件名:'FSharp.Core, 版本=2.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a'
在 Microsoft.FSharp.Text.Lexing.LexBuffer1.FromArray(char[] s) at Microsoft.FSharp.Text.Lexing.LexBuffer1.FromString(String s) 在 Marshal.vars@27.GenerateNext(IEnumerable`1& next)
警告:组装 绑定日志记录已关闭。启用程序集绑定失败 记录,设置注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) 为 1。注意:有 是与装配绑定失败相关的一些性能损失 记录。要关闭此功能,请删除注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog]。 .将使用默认值 功能。

我们发现一些帖子表明这是因为:

Windows Azure 以部分信任的方式运行应用程序,作为 沙盒他们的执行。但是,F# 核心库是 当前已安装到 GAC,但没有 AllowPartialTrustedCallers 属性。所以在构建 F# 应用程序时 要在 Azure 中运行,F# 库必须使用静态链接 ——独立。提供的模板可以解决这个问题,但您会注意到以下副作用: • 比平时长 编译时间 • 大量引用 • A 对“RDManaged.dll”的虚拟引用

http://archive.msdn.microsoft.com/fsharpazure

为了解决这个问题,我们遵循以下建议,并将 –standalone 标志放入 F# 库的构建配置中。

http://www.42spikes.com/post/F-and-Azure.aspx

但是,F# 库不能使用该标志进行编译。我们得到这个构建错误:

错误 3 写入二进制文件时出现问题 'obj\Debug\Analyzer.dll':pass2 中的类型错误 Microsoft.FSharp.Text.StructuredFormat.Joint,错误:您的一个 modules 期望类型“System.Collections.IStructuralEquatable” 在被发射的模块中定义。你可能错过了一个 输入文件 FSC 1 1
分析仪

这个构建错误可能是因为我们的 F# 项目有依赖关系吗?它引用了 FSharp.PowerPack.dll 和 Microsoft.Z3.dll,以及我们解决方案中的另一个 C# 库 AnalyzerCommon.dll(它只包含我们的 F# 和 C# 代码实现的通用接口)。

有趣的是,F# 代码被调用并且运行良好,只是直到它到达代码的某个部分——一个使用 FSharp.PowerPack.dll 的公式解析器。

任何提示将不胜感激。

谢谢,山姆

【问题讨论】:

  • 您是否将FSharp.Core.dll 连同所有依赖项放在一起(我不知道在哪里,因为我没有使用过 Azure)。默认情况下它不会在那里。 F# 静态链接有几个烦人的错误(standalone 标志也是如此)。尝试在不使用静态链接的情况下解决此问题。
  • 你确实放了'--standalone'而不是'-standalone',不是吗?
  • 是的,谢谢。并在下面查看我的评论.. 它可能围绕 FSharp.Core.dll 的版本.. 谢谢

标签: c# f# azure z3


【解决方案1】:

您必须在 WebRole 应用程序中明确引用所有必需的程序集,并将“Copy Local”属性设置为“True”。看看这个mine blog post。我首先提到的是 Copy Local。

部分代码运行而不运行的原因是 JIT 编译器。一切运行良好,直到您遇到需要缺少程序集的代码。一旦您将所有所需的程序集显式添加为参考并将“Copy Local”设置为“True”,就不会出现“File not found”异常。

如果有帮助,请跟进!

编辑

默认情况下,Windows Azure 在完全信任下运行。我认为从 SDK 1.3 开始。您可以通过右键单击 Visual Studio 解决方案中云项目中的 Web 角色来更改此设置,选择“属性”,导航“配置”并选择“完全信任”。

【讨论】:

  • 您好,感谢您的回复,是的,我将 FSharp.Core.dll 和 FSharp.PowerPack.dll 添加为对我的 ASP.Net Web 应用程序(即 Web 角色)的引用,以及使用它们的 F# 库,并将 Copy Local 设置为 true 。我参考的FSharp.Core的版本是v4.0.xxxx,异常说找不到v2.0.0.0。当遇到使用 FSharp.PowerPack.dll 的代码时会引发异常。它需要 v2.0.0.0 的 FSharp.Core.dll 吗?我尝试将我的依赖项更改为引用 v2.0.0.0,但 VisualStudio 会自动将引用恢复为 v4.0.x.x
  • @SamB - 请参阅stackoverflow.com/questions/4566858/f-powerpack-target-runtime/…,了解如何让 PowerPack 与 4.0 版本的 FSharp.Core 一起工作。
  • 谢谢@kvb,解决了问题。
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 2016-07-31
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多