我一直在研究可用于在新的.NET Core App项目中引用现有.NET Framework 4.6库的选项。
作为概念验证,我构建了一个非常简单的.NET Framework 4.6库,将其作为NuGet包发布,并将其包含在一个简单的.NET Core Web应用程序中。
到目前为止,我似乎能够让项目构建和运行的唯一方法是从project.json依赖项块中删除Microsoft.NETCore.App引用,并从frameworks属性中替换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库。
无论如何,关于我可以使用的其他选项,我有几个问题:
答案 0 :(得分:6)
我担心您无法将.NET 4.6.2 DLL加载到.NET Core应用程序中。
在某些情况下,您可以编写一次代码,然后创建.NET 4.6.2项目和.NET Core项目。两个项目都指向相同的代码文件,但每个项目都有不同的框架目标。一旦你有了这个工作,你可以构建一个nuget包,其中包含.NET 4.6.2 DLL 和 .NET Core DLL,这将使部署和构建更加简单。
假设您在MyProject.csproj
文件夹和解决方案./NET462/MyProject/
中有MySolution.sln
。
MyProject.Core
,我们会将其放入./Core/MyProject.Core/
。我们也会有一个解决方案,称之为./Core/MySolution.Core.sln
。./NET462/MyProject/
中的所有文件复制到./Core/MyProject
,包括.csproj。复制解决方案,他们将并排生活。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
}
}
.csproj
和MyProject.project.json
。创建一个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应用程序无法使用.NET 4.6.2所依赖的某些库。我已经两次这样做了System.Web
已经把我抓了出来。 .NET 4.6.2中的System.Web
实际上是IIS的包装器。找出的最好方法是尝试合并上面的项目并继续将nuget包添加到project.json
,直到找到Core不存在的内容。
May 2016中的.NET团队表示,他们在2016年底正在逐渐停止使用project.json
。此时,我想这些问题可能会因视觉工作室应该消失而消失能够处理两种.csproj
并排生活。根据您的商业情况,我会等待改变!