Используя VS2019, я создал проект функции Azure. Функция Azure запускается HTTP-запросом для преобразования содержимого CSV в файл XLSX с помощью EPPlus.
Код действительно очень прост:
[FunctionName("Function1")]
public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, ILogger log)
{
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
// line below will raise "System.Text.Encoding.CodePages.dll" not found exception
ExcelPackage xcel = new ExcelPackage();
// ... some other code
}
Экземпляр ExcelPackage вызовет следующую ошибку: «Не удалось загрузить файл или сборку «System.Text.Encoding.CodePages, версия = 5.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a». Системе не удается найти указанный файл». EPPlus полагается на System.Text.Encoding.CodePages 5.0.0.0, но похоже, что .Net core 3.1 полагается на 4.x. версия.
Обходной путь, который я придумал и успешно протестировал, заключался в том, чтобы просто скопировать System.Text.Encoding.CodePages.dll в папку bin моего решения. Но очень неудовлетворительно, потому что каждый раз, когда я перестраиваю решение, мне приходится развертывать System.Text.Encoding.CodePage.dll вручную.
Я пробовал разные вещи, которые я читал о перенаправлении привязки, но безуспешно. Не очень удивительно, поскольку перенаправление привязки больше связано с .net framework.
Это сводит меня с ума.
Экземпляр ExcelPackage вызовет следующую ошибку: «Может не загружать файл или сборку 'System.Text.Encoding.CodePages, Версия = 5.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a'. Система не может найти указанный файл." EPPlus полагается System.Text.Encoding.CodePages 5.0.0.0, но похоже, что .Net core 3.1 полагаясь на версию 4.x.
Это не имеет значения с версией пакета System.Text.Encoding.CodePages
. Я могу объяснить вам эту ситуацию (на самом деле это связано с работой после сборки инструментов лазурных функций в VS 2019.).
На самом деле файл System.Text.Encoding.CodePage.dll
уже был скопирован в папку .\bin\Release\netcoreapp3.1\bin
после создания приложения функции Azure. Но инструменты функций Azure выполнили операцию, удалив много файлов из .\bin\Release\netcoreapp3.1\bin
после создания приложения функции Azure.
Обходной путь, который я придумал и успешно протестировал, заключался в том, чтобы просто скопировать System.Text.Encoding.CodePages.dll в папке bin моего решения. Но очень неудовлетворительно, потому что каждый раз, когда я перестраиваю решение, я должен развернуть System.Text.Encoding.CodePage.dll вручную.
Вы можете попробовать использовать операцию «сборка» вместо операции «пересборка». Операция сборки не удалит System.Text.Encoding.CodePage.dll
после того, как вы поместите его в папку bin.
Это не ваша вина, я думаю, что это ошибка проектирования лазурного функционального инструмента. Если операция удаления не выполняется автоматически после операции сборки, никаких проблем не возникнет. Надеюсь, мой ответ развеет ваши сомнения.
А еще вы можете дать отзыв по этой проблеме.
(Думаю код вам не нужен, поэтому не буду его выкладывать. Проверил, работает нормально.)
Спасибо за это объяснение. На самом деле я увидел в подробном выводе сборки, что файл System.Text.Encoding.CodePage.dll был явно скопирован в мою локальную папку bin и что в конце процесса сборки файла там больше не было. При публикации в Azure из VS2019 выполняется повторная сборка. Итак, все еще копируя (я должен сказать, загружая) отсутствующую System.Text.Encoding.CodePage.dll в папку bin службы приложений в Azure. Я предоставлю обратную связь, как вы предложили.
@L.Herveleu Вы можете использовать сборку вместо перестройки.
@L.Herveleu Привет, если мой ответ ответил на ваши сомнения, можете ли вы отметить его как ответ? Это поможет другим людям, которых беспокоит эта проблема. Спасибо.:)
Большое спасибо, я скопировал «System.Text.Encoding.CodePage.dll» в папку «ProfileQueueTriggerFunction\bin\Debug\netcoreapp3.1\bin» моего проекта, и это решило мою проблему.
У меня была та же проблема, когда я пробовал аналогичный подход. Решение было «довольно простым» и немного отличалось от ответа, который дал Боуман.
System.Text.Encoding.CodePages, Version=5.0.0.0 — это пакет, созданный для платформы .NET5. Он ссылается:
Microsoft.NETCore.Platforms (>= 5.0.0)
System.Runtime.CompilerServices.Unsafe (>= 5.0.0)
Я думаю, что пакет не полностью совместим с .NetCore 3.1, как, видимо, написано.
Решение, которое я нашел, довольно простое: просто укажите версию 4.71, которая поддерживает среду выполнения, используемую функциями Azure в NetCore 3.1 (не NET5).
В обозревателе решений Visual Studio щелкните правой кнопкой мыши Проект функций Azure и выберите "Редактировать файл проекта". Затем добавьте ItemGroup, чтобы сохранить зависимость System.Text.Encoding.CodePages.dll, например:
<ItemGroup>
<PackageReference Include = "Microsoft.NET.Sdk.Functions" Version = "3.0.13" />
<PackageReference Include = "System.Text.Encoding.CodePages" Version = "5.0.0" />
</ItemGroup>
<ItemGroup>
<FunctionsPreservedDependencies Include = "System.Text.Encoding.CodePages.dll" />
</ItemGroup>
Будь счастлив!
Это не ваша вина, вы можете взглянуть на мой ответ. И, возможно, вам нужно оставить отзыв командам разработчиков функций Azure.