f#在Azure上运行时的异常

本文关键字:异常 运行时 Azure | 更新日期: 2023-09-27 18:13:51

我们在Azure中运行了一个c# web角色,c#项目调用了我们在应用程序中部署的f# dll中的代码。

当我们使用本地Azure模拟器在本地运行时,我们的f#代码被调用并运行良好。当f#代码在云中的Azure中运行时,我们的f#代码会在某个点出现异常:

解析x的函数var(2)失败。例外:filenotfoundexception:无法加载文件或程序集"FSharp。核心,版本=2.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a'或其依赖项之一。的系统找不到指定的文件。文件名称:FSharp。核心,版本=2.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a'
在microsoft . fsharp . text . lexinglexbuffer 1.FromArray(char[] s) at Microsoft.FSharp.Text.Lexing.LexBuffer 1。FromString(字符串s)Marshal.vars@27.GenerateNext (IEnumerable 1,下)
WRN:装配绑定日志被关闭。启用程序集绑定失败日志,设置注册表值[微软HKLM ' Software ' '融合!EnableLog] (DWORD)到1。注意:程序集绑定失败是否会带来一些性能损失日志记录。要关闭此功能,请删除注册表值[HKLM'Software'Microsoft'Fusion!EnableLog]. .将使用默认值函数。

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

Windows Azure以部分信任方式运行应用程序,作为执行沙箱。然而,f#核心库是当前已安装到GAC中,但没有AllowPartialTrustedCallers属性。所以在构建f#应用程序时要在Azure中运行,f#库必须使用静态链接——独立。提供的模板可以解决这个问题,但您会注意到以下副作用A .编译时间对"RDManaged.dll"的虚拟引用

http://archive.msdn.microsoft.com/fsharpazure

为了解决这个问题,我们遵循下面的建议,在f#库的构建配置中放置–standalone标志。

http://www.42spikes.com/post/F-and-Azure.aspx

然而,f#库不使用此标志进行编译。我们得到这样的构建错误:

错误3写二进制文件出错'obj'Debug'Analyzer.dll': pass2中类型错误Microsoft.FSharp.Text.StructuredFormat。关节,错误:你的一个modules期望的类型是System.Collections。IStructuralEquatable"在被发出的模块中定义。你可能少了一个输入文件FSC 1 1
分析仪

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

有趣的是,f#代码被调用并且运行良好,直到它碰到代码的特定部分——一个使用FSharp.PowerPack.dll的公式解析器。

如有任何建议,我将不胜感激。

谢谢,山姆

f#在Azure上运行时的异常

你必须明确地在你的WebRole应用程序中引用所有必需的程序集,并将"Copy Local"属性设置为"True"。看看我的博客。我首先要提到的是本地复制。

部分代码运行而其他部分不能运行的原因是JIT编译器。一切运行正常,直到遇到需要缺少程序集的代码。一旦你将所有所需的程序集显式添加为引用,并将"Copy Local"设置为"True",就不会出现"File not found"异常。

如果有帮助,请继续跟进!

编辑

Windows Azure默认以完全信任运行。从SDK 1.3开始。您可以通过右键单击Visual Studio解决方案中Cloud项目中的web角色,选择属性,导航"配置"并选择"完全信任"来更改此设置。