F#在Azure上运行时的例外情况
我们有一个在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'或其某个依赖项。 该系统找不到指定的文件。 文件名:'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.LexBuffer
1.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属性。 因此,在构建要在Azure中运行的F#应用程序时,必须使用--standalone静态链接F#库。 提供的模板负责处理这个问题,但是您会注意到以下副作用:•比平常更长的编译时间•大量引用•对“RDManaged.dll”的虚拟引用
http://archive.msdn.microsoft.com/fsharpazure
为了解决这个问题,我们遵循下面的建议,并将–standalone
标志放在F#库的Build配置中。
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
分析仪
这个构建错误可能是因为我们的F#项目的依赖关系吗? 它引用了FSharp.PowerPack.dll和Microsoft.Z3.dll,以及我们解决方案中的另一个C#库AnalyzerCommon.dll(它只包含一个公共接口,F#和C#代码都可以实现)。
有趣的是,F#代码被调用并且运行良好,直到它碰到代码的某个部分 - 一个使用FSharp.PowerPack.dll的公式分析器。
任何提示将非常感谢。
谢谢,山姆
您必须在WebRole应用程序中明确引用所有必需的程序集,并将“ 复制本地 ”属性设置为“ True ”。 看看这个我的博客文章。 我提到的第一件事是复制本地。
部分代码运行而其他部分不运行的原因是JIT编译器。 一切运行良好,直到你遇到需要缺少程序集的代码。 将所有必需的程序集显式添加为参考并将“复制本地”设置为“True”后,将不会出现“文件未找到”异常。
如果有帮助,请跟进!
编辑
Windows Azure默认情况下以完全信任运行。 自从SDK 1.3我想。 右键单击Visual Studio解决方案中的云项目中的Web角色,选择属性,导航“配置”并选择“完全信任”,即可更改此选项。
你确实放弃了'standalone'而不是'standalone',不是吗?
链接地址: http://www.djcxy.com/p/86115.html上一篇: Exceptions in F# when running on Azure
下一篇: How do I make automatic version numbers work in Visual Studio