당신은 아무런 잘못을하지 않았습니다, 이것은 일어날 것으로 예상됩니다. 새 .NET Framework 프로젝트에 자신의 DLL을 추가하기를 원한다면 라이브러리에 .NET 표준 2.0을 지정해야합니다. .NET Framework 버전은 API와 어셈블리 버전을 모두 기본적으로 지원합니다. (.NET Framework 4.7.1은 모든 API를 지원하지만 일부 어셈블리의 버전이 변경되는 방식에 버그가 있으므로 툴링 (VS 2017 15.5+)이이를 수정하기 위해 추가 어셈블리를 추가하게됩니다).
.NET Standard가 어떻게 빌드되고 지원되는 프레임 워크에 대한 지원이 구현되는지에 대한 부작용이 있습니다. 또한 대상인 .NET Standard 버전과 라이브러리 패키지를 참조하는 데 사용 된 도구에 따라 다릅니다. .NET 표준 < 2.0
, 당신은
NETStandard.Library
메타 패키지 차례 참조에 추가 (
System.*
) 패키지를 참조합니다. 이러한 패키지에는 ".NET Standard Contract"(API 세트 및 어셈블리 이름 + 버전 세트)를 구성하는 참조 어셈블리가 포함되어 있습니다.
.NET Standard 1.0-1.6 용으로 만든 NuGet 패키지가 응용 프로그램에서 참조 될 때 이러한 개별 패키지는 참조 어셈블리를 가져 오지 않고 응용 프로그램이 대상으로하는 프레임 워크의 구현 어셈블리를 가져옵니다.
.NET 코어의 경우 이미 런타임에 포함 된 어셈블리와 일치하므로 DLL 파일이 빌드 된 응용 프로그램 옆에 표시되지 않습니다. 그러나 .NET Core 1.1 (NETStandard.Library
버전 1.6.1)에 대해 새로운 패키지 집합이 릴리스 된 경우에도 변경되었습니다. 이로 인해 .NET Core 1.0 용으로 빌드 된 응용 프로그램이 .NET Core 1.1에 포함될 예정이었던 새로운 구현 어셈블리를 얻게되었습니다. (운좋게도 1.1은 "장기 지원"버전이되었습니다. LTS 약속의 일부 임).
.NET Framework에서 이러한 라이브러리는 (System.Net.Http
과 같은 일부 예외가 있음) 많은 작업을 수행하지 않고 시스템 어셈블리로 전달합니다. 예를 들어 "계약"은 System.Object
이 System.Runtime.dll
어셈블리에 정의되어 있다고 정의합니다. 따라서 System.Runtime.dll
파일은 .NET Framework 응용 프로그램에서 System.Runtime.dll
에 전달 형식 .NET Framework의 mscorlib.dll
을 포함합니다. .NET 코어에는 이미 해당 플랫폼에 대해 다른 작업을 수행하는 다른 System.Runtime.dll
이 포함되어 있습니다. 이 메커니즘은 단일 DLL 파일이 두 플랫폼 모두에서 작동하도록합니다. 이러한 형식 전달 및 추가 구현은 두 구현에서 모두 작동하는 동일한 "계약"(유형 + 어셈블리 + 어셈블리 버전)을 보장하기 때문입니다.
.NET Standard 2.0은 새로운 .NET Core 버전이 출시 될 때마다 필요한 패키지 및 DLL 수를 줄이고 필요한 업데이트를 NETStandard.Library
으로 제거하기위한 것입니다.
.NET Standard 2.0 및 .NET Core 2.0의 경우 NETStandard.Library
패키지는 코드를 프로젝트에 컴파일하기위한 참조 어셈블리 만 가져 오지만 결과 NuGet 패키지는 더 이상이 패키지에 의존하지 않습니다. 따라서 .NET Standard 2.0을 대상으로하는 라이브러리를 만들고 게시 할 때 NuGet 종속성이 없습니다 (추가하지 않는 한).
.NET 표준 라이브러리를 사용할 때 가져 오는 "지원 라이브러리"의 논리가 빌드 중에 사용되는 도구로 옮겨졌습니다. 따라서 netstandard.dll
에 대한 참조가 포함 된 라이브러리가 .NET Framework 프로젝트에 추가되면 도구에서 사용중인 .NET Framework 버전을 기반으로 필요한 지원 DLL을 추가합니다. .NET Framework 4.6.1은 이러한 종류의 DLL 파일을 통해 소급하여 .NET Standard 2.0 (이전에는 1.4)과 호환 되었기 때문에 .NET Standard 2.0 및 .NET Standard 1.5+에서 수행되었습니다. 동일한 도구를 사용하여 NuGet 패키지가 어떻게 든 그런 응용 프로그램 프로젝트로 가져 오더라도 NuGet을 통해 가져온 .NET Standard 구현 라이브러리는 빌드에서 제거됩니다. 따라서 .NET Core 1.0이 출시되었을 때 빌드 된 .NET Standard 1.0 NuGet 패키지를 참조하면 모든 NuGet 종속성이 제거되고 대신 빌드 도구와 함께 제공되는 지원 라이브러리가 제공됩니다.
아이디어는 .NET 프레임 워크 4.7.1에 netstandard.dll
, System.Runtime.dll
등이 .NET Framework의 일부이고 모든 .NET Standard 1.0-2.0 DLL 파일이 "필요한 모든 어셈블리" 작업 "문제는 이러한"받은 편지함 "dll 파일에 라이브러리에 대한로드가 실패 할 정도로 너무 낮은 버전 번호가 있다는 것입니다.이 라이브러리는 툴링을 다시 변경하여 지원되는 라이브러리의 버전 번호가 높은 DLL 파일을 포함하도록 수정되었습니다. "받은 편지함".NET Framework 어셈블리로 전달하십시오. 이 문제는 .NET Framework 4.7.2에서 수정 될 예정입니다.
실제로 출력 폴더에 추가 된 항목이 있는지 또는 패키지를 설치할 때 패키지가 무서운 목록인지 여부를 확인했습니다. 제 경험은 그것이 후자인데 여전히 위대하지는 않지만 걱정스러운 것은 아닙니다. –
@JonSkeet 내 패키지 폴더에는 이제 폴더가 하나만있을 때 폴더 목록이 길어졌습니다. 추가적으로, "NuGet 패키지 관리"화면에는 모든 패키지가 표시됩니다 (일부 패키지는 보류중인 업데이트가 있음). –
오른쪽 - bin 디렉토리에는 무엇이 있습니까? (FWIW, 나는 이것이 매우 불행한 상황이라는 것에 완전히 동의한다.나중의 릴리스에서 개선되었는지 여부는 알 수 없습니다. 그러나 이것이 제가 생산하는 일부 패키지의 경우 netstandard1.x 버전뿐만 아니라 net45 타겟을 만듭니다 ...) –