Azure函数运行时绑定因使用OpenXML SDK的System.IO.Packaging失败

时间:2018-12-06 22:25:11

标签: c# .net azure azure-functions azure-functions-runtime

我有一个可以在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中了-有什么想法吗?

1 个答案:

答案 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模板进行比较。