Что нужно, чтобы проект .NET Framework ссылался на стандартную сборку .NET? - PullRequest
1 голос
/ 31 марта 2019

У меня есть проект, созданный на основе .NET Framework 4.6.2.Одна из его зависимостей - сборка, созданная на основе .NET Standard 2.0.

Раньше она работала просто отлично, на моем старом компьютере, но теперь у меня есть новая система разработки, которую я настраиваю, и когда я пытаюсьчтобы запустить сборку с той же версией тех же инструментов, я получаю несколько десятков ошибок о том, что Netstandard DLL ссылается на несколько небольших сборок с одним пространством имен, популярных в .NET Core.Например:

Первичная ссылка "Foo" не может быть разрешена, поскольку она имеет косвенную зависимость от сборки каркаса "netstandard, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = cc7b13ffcd2ddd51", котораяне может быть решена в целевой структуре в настоящее время.».NETFramework, Version = v4.6.2" .Чтобы решить эту проблему, удалите ссылку «Foo» или перенаправьте приложение на версию платформы, которая содержит «netstandard, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = cc7b13ffcd2ddd51».(MSB3268)

Если я явно добавлю ссылку проекта на Netstandard 2.0 из GAC, то ошибка будет выглядеть следующим образом:

Первичная ссылка "netstandard", которая является структуройсборка, не может быть решена в текущей целевой структуре.».NETFramework, Version = v4.6.2" .Чтобы решить эту проблему, удалите ссылку «netstandard» или перенастройте свое приложение на версию платформы, которая содержит «netstandard».(MSB3267)

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

Кто-нибудь сталкивался с этим раньше?Здесь я нашел несколько других вопросов о попытке ссылки на сборку Netstandard из проекта C # .NET Framework, и, очевидно, это сложно из-за некоторых деталей, связанных с Roslyn, но на самом деле я использую язык Boo в своем проекте NET Framework,так что ни один из этих вопросов не имеет особого значения, плюс раньше он отлично работал.

Такое ощущение, что у него должен быть действительно простой ответ, если я просто знаю, какие детали я пропускаю ...

1 Ответ

3 голосов
/ 02 апреля 2019

Команда .NET настоятельно рекомендует перейти на net472 из-за множества проблем , когда инструментальная цепочка пытается перевести поддержку .NET Standard 2.0 на net461 – net471. Если обновление является вариантом для вас, это сэкономит много времени. Дополнительным преимуществом .NET Framework 4.7.2 является то, что в выводе вашего бина не требуется десятков shim DLL , и, конечно, есть небольшие улучшения, которые идут с любым обновлением .NET Framework. (Примечания к выпуску: net47 , net471 , net472 .)

https://twitter.com/terrajobst/status/1031999730320986112:

Извините, но мы все испортили. Мы пытались заставить .NET Framework 4.6.1 задним числом реализовать .NET Standard 2.0. Это было ошибкой, так как у нас нет машины времени и есть хвост ошибок. Если вы хотите использовать .NET Standard 1.5+ из .NET Framework, я рекомендую использовать 4.7.2.

Обратите внимание, что это не имеет ничего общего с отсутствующими API (хотя .NET Framework 4.6.1 пропускает около 100 API). Все дело в политике привязки, идентификаторах сборок и обработке сборок фреймворка в инструментах (MSBuild, ClickOnce, тестовые прогоны и т. Д.).

Извлеченный здесь урок прост: после поставки данная версия реализации .NET не должна изменять уровень поддержки .NET Standard. IOW, поддерживаемый номер .NET Standard является неизменным свойством. Поддержка более высокой версии требует доставки новой версии.

...