如何从kproj引用csproj

时间:2014-11-19 15:01:23

标签: c# asp.net-core visual-studio-2015

我正在玩VS2015ASP.NET vNext,并试图在同一解决方案中尝试将vNext类库(kproj)中的引用添加到常规类库(csproj)。 Visual Studio 2015显示以下错误消息:

  

"不支持以下项目作为参考"。

是否可以从vNext类库中添加对csproj的引用?

4 个答案:

答案 0 :(得分:23)

注意:kpm命令已被dnu取代。

Visual Studio 2015 Preview(撰写本文时)附带ASP.NET 5稳定版beta1。在此版本中,无法从ASP.NET 5项目引用csproj项目。

但是,在ASP.NET 5的开发源中,引入了命令kpm wrap以支持从ASP.NET 5项目引用csproj项目。请参阅aspnet / KRuntime存储库中的github issue #827pull request #875以解决此问题。

以下是如何使用kpm wrap

的示例

确保KRuntime is installed的最新版本(使用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

现在在ClassLibrary1(即ASP.NET 5)的project.json中,您可以添加对ClassLibrary2的引用:

...
"dependencies": {
    "ClassLibrary2": ""
},
...

注意:kpm wrap使用cmd无法正常运行,我需要启动PowerShell才能运行它。

答案 1 :(得分:11)

从(Visual Studio 2015 RC)开始, kpm 命令已替换为 dnu

  

dnu命令代表(.NET开发实用程序)

dnu wrap .\src\ClassLibrary2\ClassLibrary2.csproj

Visual Studio 2015 RC中的新ASP.NET功能和修复 http://blogs.msdn.com/b/webdev/archive/2015/04/29/new-asp-net-features-and-fixes-in-visual-studio-2015-rc.aspx

答案 2 :(得分:3)

我发现最简单的方法是为我想引用的.csproj创建一个相应的.kproj。 .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项目中引用它。

答案 3 :(得分:0)

除了这个答案,我发现你需要使用if指令(#if)来进行无错误的调用:

类似的东西:

#if ASPNET50 
 using class2
#endif

当您在通话中使用它时,您需要执行相同操作。

#if ASPNET50
   ViewBag.Message = class2.Class1.Greetings()
#endif