【发布时间】: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”的虚拟引用
为了解决这个问题,我们遵循以下建议,并将 –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 的版本.. 谢谢