我有一个可以在Functions运行时的v1中很好地运行为Azure Function的项目,但是我正忙于为v2重写它,而我遇到了麻烦。
我的Azure功能依赖于我的一个库,而该库又依赖于另一个库。这两个库都依赖于Open XML SDK,我已通过NuGet将它们安装在那些项目中。他们俩也都通过NuGet安装了System.IO.Packaging。
如果我通过控制台应用程序运行代码,则可以正常运行。当我尝试将其作为Azure函数运行时,它会进入我的库代码的途中,但随后函数运行时会因错误而失败:
System.Private.CoreLib:执行函数getWorkbook时发生异常。 ExcelGenerator:无法加载文件或程序集 'System.IO.Packaging,版本= 0.0.0.0,区域性=中性, PublicKeyToken = b03f5f7f11d50a3a'。系统找不到文件 指定。
我尝试将System.IO.Packaging添加到Azure Function项目中(我知道我不需要这样做),但是它失败了,并产生了一个新错误:
System.Private.CoreLib:执行函数时发生异常: getWorkbook。 ExcelGenerator:无法加载类型 程序集“ WindowsBase”中的“ System.IO.Packaging.CompressionOption”, 版本= 4.0.0.0,文化=中性,PublicKeyToken = 31bf3856ad364e35'。
我对第一个错误中的0.0.0.0版本号感到怀疑,而且我真的不理解第二个错误(或者说实话,为什么给System.IO.Packaging添加到Azure Function根本没有任何区别,给定这只是运行已编译的库代码)。
另一个奇怪的事情是WindowsBase没有显示在我的Azure Function的“程序集”依赖项列表中,但是它却显示在“添加引用”对话框中。如果我取消选中它,则会收到一个神秘的错误消息:“在项目中找不到名称为“ {0}”的程序集引用。”
我非常确定System.IO.Packaging或WindowsBase并没有将其传递到Azure部署中,但是我不确定如何实现。我很快发现我对DLL依赖项的工作原理并不十分了解,更不用说在Azure中了-有什么想法吗?
答案 0 :(得分:1)
要将v1函数重写为v2,请右键单击Function项目,然后单击Edit FunctionProjectName.csproj
,将Function项目的TargetFramework
更改为netcoreapp2.1
,将AzureFunctionsVersion
更改为v2
我们可能必须安装packages for v2 function,因为它们不再像v1中那样是内置的。
代码重构是必要的,如果我们遇到任何汇编问题,请在.Net Core控制台应用程序中尝试代码,以查看它是.net核心问题还是与Function运行时有关。
如果host.json中有一些配置,请注意,因为它们的某些格式已更改。
通常,建议创建模板v2函数并将旧内容与新的v2模板进行比较。