C# 在Azure上运行时F#中的异常

C# 在Azure上运行时F#中的异常,c#,f#,azure,z3,C#,F#,Azure,Z3,我们有一个在Azure中运行的C#web角色,C#项目调用我们在应用程序中部署的F#dll中的代码 当我们使用本地Azure emulator在本地运行时,我们的F#代码会被调用并正常运行。当它在云中的Azure中运行时,我们的F#代码在某一点失败,但有以下例外: 无法分析x的函数:var(2)。异常: System.IO.FileNotFoundException:无法加载文件或程序集 'FSharp.Core,版本=2.0.0.0,区域性=中性, PublicKeyToken=b03f5f7

我们有一个在Azure中运行的C#web角色,C#项目调用我们在应用程序中部署的F#dll中的代码

当我们使用本地Azure emulator在本地运行时,我们的F#代码会被调用并正常运行。当它在云中的Azure中运行时,我们的F#代码在某一点失败,但有以下例外:

无法分析x的函数:var(2)。异常: System.IO.FileNotFoundException:无法加载文件或程序集 'FSharp.Core,版本=2.0.0.0,区域性=中性, PublicKeyToken=b03f5f7f11d50a3a'或其依赖项之一。这个 系统找不到指定的文件。文件名:'FSharp.Core, 版本=2.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a'
在Microsoft.FSharp.Text.Lexing.LexBuffer
1.FromArray(char[]s)处
Microsoft.FSharp.Text.Lexing.LexBuffer
1.FromString(String s)位于 元帅vars@27.GenerateNext(IEnumerable`1&next)
警告:组装 绑定日志记录已关闭。启用程序集绑定失败 日志记录,设置注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog](DWORD)到1。注:有 某些性能损失是否与程序集绑定失败相关 登录中。要关闭此功能,请删除注册表值 [HKLM\Software\Microsoft\Fusion!启用日志]。将使用默认值 功能

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

Windows Azure以部分信任的方式运行应用程序,作为 对他们的死刑进行沙箱处理。然而,F#核心库是 当前已安装到GAC中,但没有 AllowPartialTrustedCallers属性。因此,在构建F#应用程序时 要在Azure中运行,F#库必须使用 --独立的。提供的模板解决了这一问题,但您会注意到以下副作用:•比平时更长 编译时间•大量引用•A 对“RDManaged.dll”的虚拟引用

为了避免这种情况,我们遵循下面的建议,在F#library的构建配置中添加
–standalone
标志

但是,F#库不使用此标志编译。我们得到以下生成错误:

错误3写入二进制文件时出现问题 “obj\Debug\Analyzer.dll”:类型的pass2中出现错误 Microsoft.FSharp.Text.StructuredFormat.Joint,错误:您的 模块要求类型“System.Collections.IsStructuralEquatable”为 在被发射的模块内定义。你可能错过了一次机会 输入文件FSC 1 1
分析器

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

有趣的是,F#代码被调用并运行良好,直到它到达代码的某个部分——使用FSharp.PowerPack.dll的公式解析器

任何提示都将不胜感激


谢谢,Sam

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

部分代码运行而其他部分不运行的原因是JIT编译器。一切都正常运行,直到您遇到需要缺少程序集的代码。一旦明确添加了所有所需的程序集作为参考,并将“Copy Local”设置为“True”,则不会出现“File not found”异常

如果有帮助,请跟进

编辑


默认情况下,Windows Azure以完全信任的方式运行。我想是因为SDK 1.3。您可以通过右键单击VisualStudio解决方案中云项目中的web角色、选择属性、导航“配置”并选择“完全信任”来更改此设置

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

部分代码运行而其他部分不运行的原因是JIT编译器。一切都正常运行,直到您遇到需要缺少程序集的代码。一旦明确添加了所有所需的程序集作为参考,并将“Copy Local”设置为“True”,则不会出现“File not found”异常

如果有帮助,请跟进

编辑


默认情况下,Windows Azure以完全信任的方式运行。我想是因为SDK 1.3。您可以通过右键单击VisualStudio解决方案中云项目中的web角色、选择属性、导航“配置”并选择“完全信任”来更改此设置

你把
FSharp.Core.dll
和所有依赖项放在一起了吗(我不知道放在哪里,因为我没有使用Azure)。默认情况下它不会在那里。F#静态链接(以及
standalone
flag)有几个恼人的错误。请尝试在不使用静态链接的情况下解决此问题。您确实放置了“-standalone”而不是“-standalone”,是吗?是的,谢谢。请看下面我的评论。。它可能与FSharp.Core.dll的版本有关。。感谢您将
FSharp.Core.dll
与所有依赖项放在一起(我不知道放在哪里,因为我没有使用Azure)。默认情况下它不会在那里。F#静态链接(以及
standalone
flag)有几个恼人的错误。请尝试在不使用静态链接的情况下解决此问题。您确实放置了“-standalone”而不是“-standalone”,是吗?是的,谢谢。请看下面我的评论。。它可能与FSharp.Core.dll的版本有关。。谢谢,谢谢回复,是的,我添加了FSharp.Core.dll和FSharp.PowerPack.dll作为对我的ASP.Net Web应用程序(即Web角色)和的引用