我有一个ASP.NET Core RC2 .NET框架Web项目,我想在同一解决方案中包含的常规C#类库中添加一个项目引用。
使用Visual Studio 2015 Update 2
档案 - >新项目 - > ASP.NET Core Web Application (.NET Framework)
右键点击解决方案 - >新项目 - > Class Library
我没有做任何这些:
Class Library (.NET Core)
Class Library (Portable for iOS, Android, and Windows)
Class Library (Portable)
将以下内容添加到project.json中的dependencies
:
"ClassLibrary1": {
"version": "*",
"target": "project"
}
为什么在指定项目依赖项时我不能将"target":"project"
添加到我的依赖项中?
我希望这个ASP.NET Core RC2 Web应用程序(.NET Framework)能够引用常规类库作为项目引用。
此作品
"ClassLibrary1": "*"
这不起作用
"ClassLibrary1": {
"version": "*",
"target": "project"
}
如何从ASP.NET Core RC2 Web项目向常规类库添加项目引用?
如果我运行dotnet restore
,我会收到更好的错误消息,说明为什么无法解决此问题。
dotnet :
At line:1 char:1
+ dotnet restore
+ ~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
Errors in C:\users\joshs\documents\visual studio 2015\Projects\WebApplication4\src\WebApplication4\project.json
Unable to resolve 'ClassLibrary1' for '.NETFramework,Version=v4.6.1'.
我加倍检查了类库.NET Framework 4.6.1
我已经看过cannot add reference to .net core Class library asp.net core rc2了,但这是针对.NET Core类库的。
我也看了Reference a Full Framework Library Project from ASP.NET Core MVC Web Application (RC2)?,但那是因为用户试图创建一个不针对.NET Framework的Web项目。我的project.json包含:
"frameworks": {
"net461": { }
},
如果我右键单击我的Web项目和“添加引用”,然后继续选择我的类库,它会将项目依赖项放在project.json的不同部分,但它仍然会给我相同的错误消息。 / p>
"frameworks": {
"net461": {
"dependencies": {
"ClassLibrary1": {
"target": "project"
}
}
}
},
答案 0 :(得分:3)
您可以参考:
project.json
定位完整dotnet框架的经典C#类库project.json
定位完整dotnet框架和/或CoreCLR的PCL C#类库如果您的C#类库不是PCL,那么您只能从net*
project.json
)引用它
要从VS引用,请右键单击项目 - >参考文献 - >选择项目
答案 1 :(得分:3)
一旦https://github.com/dotnet/cli/issues/3199得到解决,Victor的回答应该有效。与此同时,我使用以下解决方法:
每次构建我的类库项目时,我都会创建一个包含新版本号的NuGet包。我的ASP.NET Core RC2 project.json将NuGet包引用为带有通配符(*)版本引用的常规依赖项。然后,我在每次构建之后让我的ASP.NET Core RC2项目恢复包,这样就可以获取最新的更改。
每次构建后创建NuGet包
在您的类库项目中,添加对https://www.nuget.org/packages/CreateNewNuGetPackageFromProjectAfterEachBuild
的NuGet引用这将在您的项目中创建一个文件夹结构,如下所示:
修改 Config.ps1 文件,将$appendConfigurationAndPlatformToNuGetPackageFileName
更改为$false
。 (我发现我的参考文献没有正确使用此设置为$true
)
如果您希望能够调试到您的类库项目,请将$packOptions = ""
更改为$packOptions= "-Symbols"
此时,如果您要构建项目,将在输出目录中创建一个NuGet包(通常为bin
)。此脚本使用AssemblyInfo.cs
文件来驱动程序包的版本号。
更新AssemblyInfo.cs版本
让我们现在添加一个脚本来在每次构建后更新assemblyinfo.cs
文件版本,并将NuGet包的位置更改为本地存储库。
我把这个脚本添加到我的项目中:https://github.com/eoincampbell/powershell-scripts/blob/master/Update-AssemblyFileVersion.ps1每次调用它时,它都会更新AssemblyInfo.cs版本号。
我稍微调整了脚本以更新AssemblyFileVersion和AssemblyVersion行。改变
if ($_.StartsWith("[assembly: AssemblyFileVersion")) {
到
if ($_.StartsWith("[assembly: AssemblyFileVersion") -or $_.StartsWith("[assembly: AssemblyVersion")) {
构建自动化
现在我们希望在每次构建之后都会发生这个脚本,这样我们就不必每次都手动运行脚本了。另外,我将更改我的类库的NuGet输出的位置,因为我在ASP.NET Core项目引用的解决方案中有多个类库项目。
编辑您的类库.csproj文件。你会发现类似的东西:
<PropertyGroup>
<PostBuildEvent>REM Create a NuGet package for this project and place the .nupkg file in the project's output directory.
REM If you see this in Visual Studio's Error List window, check the Output window's Build tab for the actual error.
ECHO Creating NuGet package in Post-Build event...
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '$(ProjectDir)_CreateNewNuGetPackage\DoNotModify\CreateNuGetPackage.ps1' -ProjectFilePath '$(ProjectPath)' -OutputDirectory '$(TargetDir)' -BuildConfiguration '$(ConfigurationName)' -BuildPlatform '$(PlatformName)'"</PostBuildEvent>
</PropertyGroup>
添加PreBuildEvent以运行脚本,并将-OutputDirectory
更改为本地NuGet存储库(如果已有)。否则,您可以将包转储到此解决方案的所有类库的共享文件夹(这就是我所做的)
<PropertyGroup>
<PreBuildEvent>
ECHO Starting Pre Build Event
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '$(ProjectDir)_CreateNewNuGetPackage\DoNotModify\Update-AssemblyFileVersion.ps1' -assemblyInfoFilePath '$(TargetDir)..\\..\\Properties\\AssemblyInfo.cs'
</PreBuildEvent>
<PostBuildEvent>REM Create a NuGet package for this project and place the .nupkg file in the project's output directory.
REM If you see this in Visual Studio's Error List window, check the Output window's Build tab for the actual error.
ECHO Creating NuGet package in Post-Build event...
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '$(ProjectDir)_CreateNewNuGetPackage\DoNotModify\CreateNuGetPackage.ps1' -ProjectFilePath '$(ProjectPath)' -OutputDirectory '$(TargetDir)..\\..\\..\\LocalPackages\' -BuildConfiguration '$(ConfigurationName)' -BuildPlatform '$(PlatformName)'"</PostBuildEvent>
</PropertyGroup>
如果您现在要构建,每次都会创建NuGet包,但是您的ASP.NET Core应用程序不会获取新包。为了解决这个问题,我向dotnet restore
添加了一个预编译命令。
注意:intellisense不对,使用precompile
而非prebuild
(有关详情,请参阅https://github.com/dotnet/cli/issues/3338)
"scripts": {
"precompile": "dotnet restore",
"prepublish": [ "npm install", "bower install", "gulp copy", "gulp clean", "gulp min" ],
}
ASP.NET Core RC2 project.json
我的引用只是普通的依赖:
"dependencies": {
"Microsoft.AspNetCore.Mvc.Core": "1.0.0-rc2-final",
.
.
"Lib.IO": "*",
"Lib.Core": "*",
"Lib.Data": "*",
}
我没有打算写一个脚本来清理我的NuGet存储库, 因为经过一天的编码,我会找到几十个我的班级图书馆 包。现在,我只是在结束时手动清理它们 日/周。
每次构建ASP.NET Core时,可能需要一段时间,因为
在每次构建之前恢复包。如果你真的
有创意,您可以执行脚本来检测是否更新
类库包可用,然后运行dotnet restore
。
这是最大的痛苦。每次更改类库时,都必须记住构建它,因为您的Web项目不再具有项目引用,它不会自动构建类库。
答案 2 :(得分:2)
在工作3天后,我将整天解决类似的项目参考错误,将解决方案从RC1转换为RC2。以下是我可能与此问题相关的一些调查结果:
顺便说一下,我正在使用VS 2015 Update 2.很明显,这些问题可能是由于 VS 2015 Tooling / SDK Preview 1 中的限制/错误而不是问题< strong> ASP Core 1.0 RC2 本身。