Подтвердить что ты не робот

Как ссылаться на csproj из kproj

Я играл с VS2015 и ASP.NET vNext и застрял в попытке добавить ссылку из библиотеки классов vNext (kproj) в обычную библиотеку классов (csproj) в том же решении. В Visual Studio 2015 отображается следующее сообщение об ошибке:

"Следующие проекты не поддерживаются в качестве ссылок".

Возможно ли вообще добавить ссылки на csproj из библиотек классов vNext?

4b9b3361

Ответ 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, чтобы он запускался.

Ответ 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