Открытый статический класс и методы не найдены в пакете NuGet

Я столкнулся со странной проблемой, когда разработал пакет NuGet. Из-за архитектуры устаревшего программного обеспечения, для которого я пытаюсь написать новую функциональность, она находится в .NET Framework 4.6.1 (знаю, знаю. Мы работаем над обновлением). Пакет NuGet написан на C#, а приложение, которое будет ссылаться на пакет NuGet, написано на VB .NET, то есть на .NET Framework 4.6.1. Устаревшее приложение использует три пакета NuGet, которые я написал для этого решения, но они не отображаются как ошибки.

Проблема в заголовке этого вопроса. Открытый статический класс и методы в написанном мною пакете NuGet помечены как «не объявленные. Они могут быть недоступны из-за уровня защиты». Из-за этой ошибки я явно не могу построить.

Я пробовал следующее:

  1. Удаление папок BIN/OBJ
  2. Восстановление/очистка и создание решений
  3. Увеличение версии NuGet для проверки того, что старые ссылки не сохраняются.
  4. Добавление ссылок на пакеты NuGet, которые поддерживают мой пакет NuGet (в основном пакеты, поддерживающие Json)
  5. Удаление и чтение ссылок на пакеты NuGet на мои пакеты

Возможно, стоит также отметить, что ветка, в которой я работаю для устаревших приложений, собирается без изменений, а также строится со ссылками на мои пакеты NuGet. Он не собирается, как только я добавляю вызовы в пакет NuGet. Мне интересно, проблема ли это в функции Wait(), но я не могу определить реальную проблему. Ошибки, которые появляются в выходных данных во время сборки, просто говорят на одном и том же языке: «не найдено/недоступно».

Примеры кода ниже:

В пакете NuGet у меня есть следующий код.

public static class ClassInNugetPackage
{
    public static async Task Initialize(string customerNumber, int locationId)
    {
        await SystemState.Instance.Initialize(customerNumber, locationId);
    }

    public static async Task SetApiUrl(string url)
    {
        await SystemState.Instance.SetApiUrl(url);
    }
}

Устаревшее приложение будет вызывать это в конструкторе формы следующим образом:

Public Sub New()
    InitializeComponent()

    Dim customerNumber = "170"
    Dim customerLocationId = 2140
    NamespaceInNugetPackage.ClassInNugetPackage.SetApiUrl("https://localhost:7012").Wait()
    NamespaceInNugetPackage.ClassInNugetPackage.Initialize(customerNumber, customerLocationId).Wait()

    If ClassInNugetPackage.BooleanValue.IsEnabled Then
        MsgBox("Yes!")
    End If
    
    ...
End Sub

Является ли пакет NuGet общедоступным? Если да, можете ли вы сказать нам, какой именно, и какой фактический класс и метод вы пытаетесь использовать?

Jon Skeet 25.06.2024 20:20

Если метод объявлен как async, вам следует Await использовать его, даже в VB. Но я не уверен, что это было возможно еще в версии 4.6.1. Однако, поскольку вы управляете пакетом NuGet, а устаревшее приложение использует их синхронно, я бы изменил пакет, добавив эквивалентные синхронные методы, которые может использовать устаревшее приложение. вызов. Внутри пакета вы можете просто вызвать и дождаться асинхронных методов, чтобы не было фактического дублирования кода.

Joel Coehoorn 25.06.2024 20:23

@JonSkeet Пакет NuGet — это частное решение в моем офисе, поэтому, к сожалению, я не могу поделиться им публично. Код, который я здесь включил, примерно 1:1 с кодом, который есть в нашей кодовой базе. Пространства имен и имена классов были заменены, вот и все. Считаете ли вы, что мне не хватает пакета или ссылки, которые могут решить эту проблему? @ JoelCoehoorn Я попробую и посмотрю, решит ли это проблему.

Steven 25.06.2024 21:35

Intellisense показывает, что пространства имен и классы видимы, я могу выполнить автозаполнение и просмотреть определенные общедоступные методы, которые я представил в имени класса, однако при сборке Visual Studio не удается это сделать. Моими следующими большими шагами будет попытка использовать MSBuild вне Visual Studio, и если это сработает, я посмотрю, нужно ли мне обновить или исправить Visual Studio.

Steven 25.06.2024 22:52

@JoelCoehoorn В целом я согласен, но Wait может быть приемлемым в некоторых случаях, например. консольное приложение.

Craig 25.06.2024 23:36

Похоже, что-то сломалось в процессе сборки; Я сделал тестовое решение с библиотекой C# Framework 4.6.1, состоящей из общедоступного статического класса со статической ожидаемой функцией, и консольной программы Framework 4.6.1 VB, которая ссылалась на библиотеку C# и (как единственный оператор в программе) вызывала Wait по результату вызова процедуры. Он построен без ошибок.

Craig 25.06.2024 23:44

Если вы в настоящее время используете PackageRef, что произойдет, если вы переключитесь на использование packages.config?

Craig 25.06.2024 23:47

NuGet предполагает, что пакеты неизменяемы, а это означает, что каждый раз, когда вы изменяете пакет (добавляете новые API, исправляете ошибки и т. д.), вам «необходимо» увеличивать версию пакета. Альтернативно вы можете удалить пакет из своего глобального каталога пакетов, но если кто-то еще восстановил более раннюю версию пакета, NuGet не будет загружать более новую копию на свой компьютер, если он также не удалит пакет локально.

zivkan 26.06.2024 01:54

@zivkan см. пункт 3 в разделе «Я пробовал следующее:».

Craig 26.06.2024 16:04

Вы упомянули, что получили только одну «ошибку», проверили ли вы, что не было предупреждений о разрешении пакета? Иногда возникают проблемы, которые не останавливают сборку на этом этапе, но приводят к ошибкам позже. Это может помочь повысить детализацию выходных данных сборки, чтобы получить больше информации о разрешении эталонных сборок.

Craig 26.06.2024 18:00

@Craig Я тоже ценю твой вклад. Я использовал инструмент обновления .NET для временного перехода на проект SDK, чтобы посмотреть, будут ли мои выходные данные более отражать причинную проблему. Когда я попытался выполнить сборку, были обнаружены понижения версии пакета, которые я пропустил ранее; Поэтому я отменил свои изменения через git, а затем понизил ссылки на свой пакет nuget. Когда я приступил к сборке, я столкнулся с несвязанной проблемой, поэтому сейчас ее ищу. Я обновлю, как только решу эту проблему. Всем спасибо за ваш вклад, они помогли мне получить больше информации.

Steven 26.06.2024 18:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
11
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, я не сам пришел к такому решению. Комментарии сообщества действительно направили меня в лучшем направлении и привели к этому решению. База кода, к которой я пытаюсь добавить функциональность, устарела и содержит много ссылок на старые версии пакетов NuGet (опять же, мы работаем над их обновлением).

Теперь я могу строить, потому что сделал следующее:

  1. Убедился, что нахожусь в ветке git-репозитория основного приложения.
  2. Использовал .NET Upgrade Assistant для перехода на формат .NET SDK.
  3. Попытка сборки (при этом изменилось выходное сообщение, которое мне предоставила Visual Studio, в котором говорилось, что обнаружено два обновления пакета).
  4. Вернул устаревшее приложение через git.
  5. Пересобрал устаревшее приложение, чтобы убедиться, что сборка прошла успешно.
  6. Microsoft.Bcl.AsyncInterfaces и System.Threading.Tasks.Extensions понижены до версий, найденных в устаревшем приложении.
  7. Увеличена информация о сборке моего пакета NuGet.
  8. Запустил пакет NuGet в каталоге пакетов nuget через терминал Windows.
  9. Ссылка на новую версию пакета NuGet в устаревшем приложении.
  10. Успешно создали устаревшее приложение
  11. Добавил свой код
  12. Успешно создано устаревшее приложение с кодом, который ссылается на пакеты NuGet.

Спасибо всем за вашу помощь, и особенно Крейгу за указание направления, которое привело к созданию packageref и packages.config. Это заставило меня задуматься об использовании Помощника по обновлению, чтобы посмотреть, будет ли результат отличаться, и так оно и было. До перехода Upgrade Assistant на .NET SDK я видел единственную ошибку для каждого экземпляра вызова моего пакета NuGet, который имел один и тот же набор слов (не найден или недоступен), и это меня смутило.

Спасибо всем за внимание, участие и помощь. Это подтолкнуло меня к следующему шагу!

Другие вопросы по теме