在 .NET Core App 1.0.0 项目中引用 Framework 4.6 库
Referencing Framework 4.6 Library in in .NET Core App 1.0.0 project
我一直在研究可用于在新的 .NET Core 应用程序项目中引用现有 .NET Framework 4.6 库的选项。
作为概念证明,我构建了一个非常简单的 .NET Framework 4.6 库,将其发布为 NuGet 包并将其包含在一个简单的 .NET Core Web 应用程序中。
到目前为止,我似乎能够构建项目并 运行 的唯一方法是从 project.json 依赖项块中删除 Microsoft.NETCore.App 引用并替换 netcoreapp1来自框架 属性 的 .0 部分带有 net461 块。
完整 project.json 以下:
{
"dependencies": {
/*"Microsoft.NETCore.App": {
"version": "1.0.0",
"type": "platform"
},*/
"Microsoft.AspNetCore.Diagnostics": "1.0.0",
"Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
"Microsoft.Extensions.Logging.Console": "1.0.0",
"FileIOLibrary_1_0_0_0": "1.0.0"
},
"tools": {
"Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
},
/*"frameworks": {
"netcoreapp1.0": {
"imports": [
"dotnet5.6",
"portable-net45+win8",
"net461"
]
}
},*/
"frameworks": {
"net461": {
"imports": [
"dotnet5.6",
"portable-net45+win8"
]
}
},
"buildOptions": {
"emitEntryPoint": true,
"preserveCompilationContext": true
},
"runtimeOptions": {
"configProperties": {
"System.GC.Server": true
}
},
"publishOptions": {
"include": [
"wwwroot",
"web.config"
]
},
"scripts": {
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
}
这基本上意味着所有引用都是 .NET Framework 4.6 库。
无论如何,我有几个关于我可用的其他选项的问题:
- 是否可以指定只有我导入的库应该针对 .NET 4.6 Framework 而所有其他引用都应该使用 .NET 核心?如果是这样,这意味着我可以将 Microsoft.NETCore.App 引用添加回项目中。
- 如果以上方法不可行,我能否将我的库重建为兼容的 .NET 标准库(我相信 1.6 版在 Framework 4.6 和 Core 1.0.0 之间兼容)?我一直无法在 Visual Studio 中看到允许我针对 .NET Standard 构建库的选项,因此如果可以的话,我将不胜感激这方面的一些指示。
恐怕您无法将 .NET 4.6.2 DLL 加载到 .NET Core 应用程序中。
备选方案
在某些情况下,您可以编写一次代码,然后拥有一个 .NET 4.6.2 项目和一个 .NET Core 项目。两个项目都指向相同的代码文件,但每个项目都有不同的框架目标。完成该工作后,您可以构建一个包含 .NET 4.6.2 DLL 和 .NET Core DLL 的 nuget 包,这将使部署和构建变得更加简单。
如何为每个框架构建相同的代码文件
假设您在文件夹 ./NET462/MyProject/
中有一个 MyProject.csproj
和一个解决方案 MySolution.sln
.
- 首先创建一个空的 .NET Core 库。我们将其命名为
MyProject.Core
,并将其放入 ./Core/MyProject.Core/
。我们也会有一个解决方案,称之为 ./Core/MySolution.Core.sln
.
- 现在将原始
./NET462/MyProject/
中的所有文件复制到 ./Core/MyProject
中,包括 .csproj。也复制解决方案,它们将并存。
- 如果您现在加载原始解决方案,那么 Visual Studio 将抛出错误,因为 project.json(核心项目使用)和 .csproj(核心项目使用)之间会发生冲突由 .NET 4.6.2 项目使用。
- 要停止这种情况,请创建一个名为
MyProject.project.json
的新文件。当加载 .NET 462 项目时,它充当 project.json 的伴随。将以下内容放入其中:
MyProject.project.json
{
"version": "1.0.0-*",
"description": "My Class Library",
"authors": [
"Your Name"
],
"tags": [
""
],
"projectUrl": "",
"licenseUrl": "",
"runtimes": {
"win": {}
},
"frameworks": {
"net452": {} // You might want net462
},
"dependencies": {
"Newtonsoft.Json": "9.0.1" /// Just an example of a nuget package
}
}
- 您的 .NET 4.6.2 项目现在应该像以前一样构建。
- 现在打开核心解决方案(可以同时打开两个 Visual Studio),您会看到所有文件都已添加到其中。在 .NET Core / xproj 下,默认包含 Project.json 个文件。您需要忽略特定于 .NET 462 的文件,即
.csproj
和 MyProject.project.json
.
- 在添加 nuget 包之前,它可能不会构建。
如何将 .NET Core 和 .NET 放入同一个 Nuget
- 在发布模式下构建每个解决方案后,您将有两个输出,每个框架都有一个 DLL。您可以更改项目文件中 DLL 的名称(分别为 .csproj 和 project.json),但 nuget 不关心。
创建一个 package.nuspec
文件并将以下内容放入其中:
<!-- language: lang-xml -->
<?xml version="1.0"?>
<package>
<metadata>
<id>MyProject</id>
<version>1.0.0</version>
<authors>Me</authors>
<owners>Me</owners>
<projectUrl></projectUrl>
<iconUrl>FILL ME IN</iconUrl>
<description>FILL ME IN</description>
<copyright>FILL ME IN</copyright>
<releaseNotes>First attempt</releaseNotes>
<tags>FILL ME IN</tags>
<dependencies>
<group targetFramework="dotnet">
<dependency id="Newtonsoft.Json" version="9.0.1" />
</group>
<group targetFramework="net452">
<dependency id="Newtonsoft.Json" version="9.0.1" />
</group>
</dependencies>
<frameworkAssemblies>
<frameworkAssembly assemblyName="System.Core" targetFramework="net452"/>
<frameworkAssembly assemblyName="System.Core" targetFramework="dotnet" />
</frameworkAssemblies>
</metadata>
<files>
<file src="Core\MyProject\bin\release\MyProject.dll" target="lib/net452" />
<file src="Core\MyProject\bin\release\MyProject.Core.dll" target="lib/dotnet" />
</files>
</package>
使用它来构建您的 nuget 包,当包含在您的主系统中时,nuget 将提供正确的包。
更大的例子
我的 JsonApi 库执行此操作,此外它还有两个 Web 项目,一个用于 .NET 4.6.2,一个用于 .NET Core,因为它们使用不同的基础 类。两者都使用主共享库。
重要警告
您的 .NET 4.6.2 所依赖的某些库将无法用于您的核心应用程序。我已经这样做了两次,System.Web
让我很吃惊。 System.Web
在 .NET 4.6.2 中实际上是 IIS 的包装器。找出答案的最佳方法是尝试合并上面的项目,并继续将 nuget 包添加到 project.json
,直到遇到 Core 不存在的内容。
情况正在发生变化
May 2016 中的 .NET 团队表示,他们将在 2016 年底不再使用 project.json
。届时,我想这些问题可能会消失,因为 visual studio应该可以同时处理两种.csproj
并存。根据您的商业情况,我会等待更改!
我一直在研究可用于在新的 .NET Core 应用程序项目中引用现有 .NET Framework 4.6 库的选项。
作为概念证明,我构建了一个非常简单的 .NET Framework 4.6 库,将其发布为 NuGet 包并将其包含在一个简单的 .NET Core Web 应用程序中。
到目前为止,我似乎能够构建项目并 运行 的唯一方法是从 project.json 依赖项块中删除 Microsoft.NETCore.App 引用并替换 netcoreapp1来自框架 属性 的 .0 部分带有 net461 块。
完整 project.json 以下:
{
"dependencies": {
/*"Microsoft.NETCore.App": {
"version": "1.0.0",
"type": "platform"
},*/
"Microsoft.AspNetCore.Diagnostics": "1.0.0",
"Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
"Microsoft.Extensions.Logging.Console": "1.0.0",
"FileIOLibrary_1_0_0_0": "1.0.0"
},
"tools": {
"Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
},
/*"frameworks": {
"netcoreapp1.0": {
"imports": [
"dotnet5.6",
"portable-net45+win8",
"net461"
]
}
},*/
"frameworks": {
"net461": {
"imports": [
"dotnet5.6",
"portable-net45+win8"
]
}
},
"buildOptions": {
"emitEntryPoint": true,
"preserveCompilationContext": true
},
"runtimeOptions": {
"configProperties": {
"System.GC.Server": true
}
},
"publishOptions": {
"include": [
"wwwroot",
"web.config"
]
},
"scripts": {
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
}
这基本上意味着所有引用都是 .NET Framework 4.6 库。
无论如何,我有几个关于我可用的其他选项的问题:
- 是否可以指定只有我导入的库应该针对 .NET 4.6 Framework 而所有其他引用都应该使用 .NET 核心?如果是这样,这意味着我可以将 Microsoft.NETCore.App 引用添加回项目中。
- 如果以上方法不可行,我能否将我的库重建为兼容的 .NET 标准库(我相信 1.6 版在 Framework 4.6 和 Core 1.0.0 之间兼容)?我一直无法在 Visual Studio 中看到允许我针对 .NET Standard 构建库的选项,因此如果可以的话,我将不胜感激这方面的一些指示。
恐怕您无法将 .NET 4.6.2 DLL 加载到 .NET Core 应用程序中。
备选方案
在某些情况下,您可以编写一次代码,然后拥有一个 .NET 4.6.2 项目和一个 .NET Core 项目。两个项目都指向相同的代码文件,但每个项目都有不同的框架目标。完成该工作后,您可以构建一个包含 .NET 4.6.2 DLL 和 .NET Core DLL 的 nuget 包,这将使部署和构建变得更加简单。
如何为每个框架构建相同的代码文件
假设您在文件夹 ./NET462/MyProject/
中有一个 MyProject.csproj
和一个解决方案 MySolution.sln
.
- 首先创建一个空的 .NET Core 库。我们将其命名为
MyProject.Core
,并将其放入./Core/MyProject.Core/
。我们也会有一个解决方案,称之为./Core/MySolution.Core.sln
. - 现在将原始
./NET462/MyProject/
中的所有文件复制到./Core/MyProject
中,包括 .csproj。也复制解决方案,它们将并存。 - 如果您现在加载原始解决方案,那么 Visual Studio 将抛出错误,因为 project.json(核心项目使用)和 .csproj(核心项目使用)之间会发生冲突由 .NET 4.6.2 项目使用。
- 要停止这种情况,请创建一个名为
MyProject.project.json
的新文件。当加载 .NET 462 项目时,它充当 project.json 的伴随。将以下内容放入其中:
MyProject.project.json
{
"version": "1.0.0-*",
"description": "My Class Library",
"authors": [
"Your Name"
],
"tags": [
""
],
"projectUrl": "",
"licenseUrl": "",
"runtimes": {
"win": {}
},
"frameworks": {
"net452": {} // You might want net462
},
"dependencies": {
"Newtonsoft.Json": "9.0.1" /// Just an example of a nuget package
}
}
- 您的 .NET 4.6.2 项目现在应该像以前一样构建。
- 现在打开核心解决方案(可以同时打开两个 Visual Studio),您会看到所有文件都已添加到其中。在 .NET Core / xproj 下,默认包含 Project.json 个文件。您需要忽略特定于 .NET 462 的文件,即
.csproj
和MyProject.project.json
. - 在添加 nuget 包之前,它可能不会构建。
如何将 .NET Core 和 .NET 放入同一个 Nuget
- 在发布模式下构建每个解决方案后,您将有两个输出,每个框架都有一个 DLL。您可以更改项目文件中 DLL 的名称(分别为 .csproj 和 project.json),但 nuget 不关心。
创建一个
package.nuspec
文件并将以下内容放入其中:<!-- language: lang-xml --> <?xml version="1.0"?> <package> <metadata> <id>MyProject</id> <version>1.0.0</version> <authors>Me</authors> <owners>Me</owners> <projectUrl></projectUrl> <iconUrl>FILL ME IN</iconUrl> <description>FILL ME IN</description> <copyright>FILL ME IN</copyright> <releaseNotes>First attempt</releaseNotes> <tags>FILL ME IN</tags> <dependencies> <group targetFramework="dotnet"> <dependency id="Newtonsoft.Json" version="9.0.1" /> </group> <group targetFramework="net452"> <dependency id="Newtonsoft.Json" version="9.0.1" /> </group> </dependencies> <frameworkAssemblies> <frameworkAssembly assemblyName="System.Core" targetFramework="net452"/> <frameworkAssembly assemblyName="System.Core" targetFramework="dotnet" /> </frameworkAssemblies> </metadata> <files> <file src="Core\MyProject\bin\release\MyProject.dll" target="lib/net452" /> <file src="Core\MyProject\bin\release\MyProject.Core.dll" target="lib/dotnet" /> </files> </package>
使用它来构建您的 nuget 包,当包含在您的主系统中时,nuget 将提供正确的包。
更大的例子
我的 JsonApi 库执行此操作,此外它还有两个 Web 项目,一个用于 .NET 4.6.2,一个用于 .NET Core,因为它们使用不同的基础 类。两者都使用主共享库。
重要警告
您的 .NET 4.6.2 所依赖的某些库将无法用于您的核心应用程序。我已经这样做了两次,System.Web
让我很吃惊。 System.Web
在 .NET 4.6.2 中实际上是 IIS 的包装器。找出答案的最佳方法是尝试合并上面的项目,并继续将 nuget 包添加到 project.json
,直到遇到 Core 不存在的内容。
情况正在发生变化
May 2016 中的 .NET 团队表示,他们将在 2016 年底不再使用 project.json
。届时,我想这些问题可能会消失,因为 visual studio应该可以同时处理两种.csproj
并存。根据您的商业情况,我会等待更改!