我们有一个在 Azure 中运行的 C# Web 角色,C# 项目调用我们随应用程序部署的 F# dll 中的代码。
当我们使用本地 Azure 模拟器在本地运行时,我们的 F# 代码被调用并运行良好。当它在云中的 Azure 中运行时,我们的 F# 代码在某个时间点失败,并出现以下异常:
无法解析 x 的函数:var(2).Exception: System.IO.FileNotFoundException: 无法加载文件或程序集 'FSharp.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。该系统找不到指定的文件。
文件名: Microsoft.FSharp.Text.Lexing.LexBuffer1.FromArray(char[] s) at Microsoft.FSharp.Text.Lexing.LexBuffer
1.FromString(String s) at Marshal.vars@27.GenerateNext(IEnumerable) 的“FSharp.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 1&下一个)
警告:程序集绑定日志记录已关闭。要启用程序集绑定失败日志记录,请将注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) 设置为 1。注意:与程序集绑定失败日志记录相关的一些性能损失。要关闭此功能,请删除注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog]。.将使用默认功能。
我们发现一些帖子表明这是因为:
Windows Azure 以部分信任的方式运行应用程序,作为沙盒执行的一部分。但是,F# 核心库当前已安装到 GAC 中,但没有 AllowPartialTrustedCallers 属性。因此,在构建要在 Azure 中运行的 F# 应用程序时,必须使用 --standalone 静态链接 F# 库。提供的模板可以解决这个问题,但您会注意到以下副作用: • 编译时间比平时长 • 大量引用 • 对“RDManaged.dll”的虚拟引用
为了解决这个问题,我们遵循以下建议并将–standalone
标志放入 F# 库的构建配置中。
http://www.42spikes.com/post/F-and-Azure.aspx
但是,F# 库不使用此标志进行编译。我们得到这个构建错误:
错误 3 写入二进制“obj\Debug\Analyzer.dll”时出现问题:Microsoft.FSharp.Text.StructuredFormat.Joint 类型的 pass2 出错,错误:您的模块之一需要类型“System.Collections.IStructuralEquatable”在被发射的模块中定义。您可能缺少输入文件 FSC 1 1
Analyzer
这个构建错误可能是因为我们的 F# 项目具有依赖关系吗?它引用了 FSharp.PowerPack.dll 和 Microsoft.Z3.dll,以及我们解决方案中的另一个 C# 库 AnalyzerCommon.dll(它只包含我们的 F# 和 C# 代码实现的通用接口)。
有趣的是,F# 代码被调用并且运行良好,直到它到达代码的某个部分——一个使用 FSharp.PowerPack.dll 的公式解析器。
任何提示将非常感谢。
谢谢,山姆