Как ссылаться на csproj из kproj
Я играл с VS2015
и ASP.NET vNext
и застрял в попытке добавить ссылку из библиотеки классов vNext (kproj) в обычную библиотеку классов (csproj) в том же решении. В Visual Studio 2015 отображается следующее сообщение об ошибке:
"Следующие проекты не поддерживаются в качестве ссылок".
Возможно ли вообще добавить ссылки на csproj из библиотек классов vNext?
Ответы
Ответ 1
Примечание. Команда kpm была заменена на dnu.
Предварительный просмотр Visual Studio 2015 (с момента написания этого) поставляется с стабильным выпуском beta1 в ASP.NET 5. В этой версии нет способа ссылаться на проект csproj из проекта ASP.NET 5.
Однако в канале разработки ASP.NET 5 была введена команда kpm wrap
для поддержки ссылок на csproj-проекты из проектов ASP.NET 5. См. Github issue # 827 в репозитории aspnet/KRuntime и запрос на pull # 875, который закрывает эту проблему.
Вот пример использования kpm wrap
:
Убедитесь, что установлена новая версия KRuntime (проверьте это с помощью команды kvm list
) (я протестировал это с помощью версии 1.0.0-beta2-10709
).
Создайте проект библиотеки классов ASP.NET 5, я использовал имя ClassLibrary1.
Создайте "нормальную" библиотеку классов csproj, я назвал эту ClassLibrary2 (убедитесь, что вы поместили ее в папку src).
В командной строке из solutiondirectory запустите команду
kpm wrap .\src\ClassLibrary2
Это дает результат:
Wrapping project 'ClassLibrary2' for '.NETFramework,Version=v4.5'
Source C:\Users\andersns\Source\ClassLibrary1\src\ClassLibrary2\ClassLibrary2.csproj
Target C:\Users\andersns\Source\ClassLibrary1\wrap\ClassLibrary2\project.json
Adding bin paths for '.NETFramework,Version=v4.5'
Assembly: ../../src/ClassLibrary2/obj/debug/ClassLibrary2.dll
Pdb: ../../src/ClassLibrary2/obj/debug/ClassLibrary2.pdb
Теперь в project.json ClassLibrary1 (который является ASP.NET 5) вы можете добавить ссылку на ClassLibrary2 следующим образом:
...
"dependencies": {
"ClassLibrary2": ""
},
...
Примечание: kpm wrap
не работал должным образом для меня с cmd, мне нужно запустить powershell, чтобы он запускался.
Ответ 2
Начиная с (Visual Studio 2015 RC) команда kpm была заменена на dnu
Команда dnu означает (.NET Development Utility)
dnu wrap .\src\ClassLibrary2\ClassLibrary2.csproj
Новые возможности и исправления ASP.NET в Visual Studio 2015 RC
http://blogs.msdn.com/b/webdev/archive/2015/04/29/new-asp-net-features-and-fixes-in-visual-studio-2015-rc.aspx
Ответ 3
Мне было проще просто создать соответствующий .kproj для .csproj, который я хочу использовать. Для .kproj не требуется перечислять каждый включенный файл, так что это довольно просто.
Вы можете создать YourProject.kproj в виде текстового файла с приведенным ниже содержимым и только заменить [REPLACE_WITH_UNIQUE_GUID] и [ROOT_NAMESPACE].
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
<Import Project="$(VSToolsPath)\AspNet\Microsoft.Web.AspNet.Props" Condition="'$(VSToolsPath)' != ''" />
<PropertyGroup Label="Globals">
<ProjectGuid>[REPLACE_WITH_UNIQUE_GUID]</ProjectGuid>
<RootNamespace>[ROOT_NAMESPACE]</RootNamespace>
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">..\artifacts\obj\$(MSBuildProjectName)</BaseIntermediateOutputPath>
<OutputPath Condition="'$(OutputPath)'=='' ">..\artifacts\bin\$(MSBuildProjectName)\</OutputPath>
</PropertyGroup>
<PropertyGroup>
<SchemaVersion>2.0</SchemaVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<ProduceOutputsOnBuild>True</ProduceOutputsOnBuild>
</PropertyGroup>
<Import Project="$(VSToolsPath)\AspNet\Microsoft.Web.AspNet.targets" Condition="'$(VSToolsPath)' != ''" />
</Project>
Затем вы можете добавить этот проект в свое решение и ссылаться на него из своего проекта MVC 6.
Ответ 4
В дополнение к этому ответу я обнаружил, что вам нужно использовать директиву if (#if), чтобы сделать вызов без ошибок:
Что-то вроде:
#if ASPNET50
using class2
#endif
Когда вы используете его в вызове, вам нужно сделать то же самое.
#if ASPNET50
ViewBag.Message = class2.Class1.Greetings()
#endif