0

我们有一个在 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.LexBuffer 1.FromArray(char[] s) at Microsoft.FSharp.Text.Lexing.LexBuffer1.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”的虚拟引用

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

为了解决这个问题,我们遵循以下建议并将–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 的公式解析器。

任何提示将非常感谢。

谢谢,山姆

4

1 回答 1

3

您必须在 WebRole 应用程序中显式引用所有必需的程序集,并将“ Copy Local ”属性设置为“ True ”。看看这篇我的博客文章。我提到的第一件事是复制本地。

部分代码运行而不运行的原因是 JIT 编译器。一切运行良好,直到您遇到需要缺少程序集的代码。一旦您将所有必需的程序集显式添加为参考并将“复制本地”设置为“真”,就不会有“找不到文件”异常。

如果有帮助,请跟进!

编辑

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

于 2011-11-09T12:34:24.193 回答