在Azure上运行时F#中的例外情况

时间:2011-11-09 12:16:55

标签: c# f# azure z3

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

当我们使用本地Azure模拟器在本地运行时,我们的F#代码被调用并运行正常。当它在云中运行时,我们的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)at at   Marshal.vars@27.GenerateNext(IEnumerable`1& next)
  WRN:大会   绑定日志记录已关闭。启用程序集绑定失败   记录,设置注册表值   [HKLM \ Software \ Microsoft \ Fusion!EnableLog](DWORD)为1.注意:有   与程序集绑定失败相关的一些性能损失   日志记录。要关闭此功能,请删除注册表值   [HKLM \ SOFTWARE \微软\融合!EnableLog。 。将使用默认值   功能

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

  

Windows Azure以部分信任方式运行应用程序,作为其中的一部分   沙箱执行。但是,F#核心库是   目前已安装到GAC中,但没有   AllowPartialTrustedCallers属性。所以在构建F#应用程序时   要在Azure中运行,F#库必须使用静态链接   --standalone。提供的模板会处理此问题,但您会注意到以下副作用:•比平时更长   编译时间•大量参考文献•A   对“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':类型为pass2时出错   Microsoft.FSharp.Text.StructuredFormat.Joint,错误:你的一个   模块期望类型'System.Collections.IStructuralEquatable'   在被发射的模块中定义。你可能会错过一个   输入文件FSC 1 1
  分析器

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

有趣的是F#代码被调用并且运行正常,直到它遇到代码的某个部分 - 使用FSharp.PowerPack.dll的公式解析器。

任何提示都将不胜感激。

谢谢,Sam

1 个答案:

答案 0 :(得分:3)

您必须在WebRole应用程序中明确引用所有必需的程序集,并设置" 复制本地"属性为" True "。看看这个mine blog post。我提到的第一件事就是复制本地。

部分代码运行的原因和其他代码运行的原因是JIT编译器。一切都运行正常,直到你找到需要缺少组件的代码。一旦您将所有所需的程序集明确添加为参考并设置"复制本地"到" True",不会有"找不到文件"异常。

如果有帮助,请跟进!

修改

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