我们在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.LexBuffer1.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”的虚拟引用
为了试图解决这个问题,我们遵循以下建议并将–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
答案 0 :(得分:3)
您必须在WebRole应用程序中明确引用所有必需的程序集,并设置" 复制本地"属性为" True "。看看这个mine blog post。我提到的第一件事就是复制本地。
部分代码运行的原因和其他代码运行的原因是JIT编译器。一切都运行正常,直到你找到需要缺少组件的代码。一旦您将所有所需的程序集明确添加为参考并设置"复制本地"到" True",不会有"找不到文件"异常。
如果有帮助,请跟进!
修改强>
默认情况下,Windows Azure以完全信任方式运行。自从我认为SDK 1.3以来。您可以通过在Visual Studio解决方案中右键单击Cloud项目中的Web角色来更改此项,选择“属性”,导航“#34;配置"并选择"完全信任"。