【问题标题】:How to reference csproj from kproj如何从 kproj 引用 csproj
【发布时间】:2015-01-17 03:49:51
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    注意:kpm 命令已替换为 dnu。

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

    但是,在 ASP.NET 5 的开发提要中,引入了命令 kpm wrap 以支持从 ASP.NET 5 项目引用 csproj-projects。请参阅 aspnet/KRuntime 存储库中的 github issue #827 和关闭问题的 pull 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 以使其运行。

    【讨论】:

    • 男人@AndersNS,你是最前沿的:)。我们仍在修复它的问题,并正在努力将其集成到 Visual Studio 添加参考对话框中。
    • PS > kpm wrap System.Exception: TODO: Error: unrecognized argument 'wrap' Microsoft.Framework.Runtime.Common.CommandLine.CommandLineApplication.HandleUnexpectedArg(CommandLineApplication command, String[] args, Int32 index , 字符串 argTypeName) Microsoft.Framework.Runtime.Common.CommandLine.CommandLineApplication.Execute(String[] args) Microsoft.Framework.PackageManager.Program.Main(String[] args)
    • 如何升级到 1.0.0-beta2-10709 ? PS > kvm upgrade 确定已安装最新版本 KRE-CLR-x86.1.0.0-beta1。添加 C:\Users\user\.kre\packages\KRE-CLR-x86.1.0.0-beta1\bin 以处理 PATH 添加 C:\Users\user\.kre\packages\KRE-CLR-x86.1.0。 0-beta1\bin 到用户 PATH 将别名 'default' 更新为 'KRE-CLR-x86.1.0.0-beta1'
    • 如果旧的类库除了 aspnet50x 框架之外还针对 net45,该工具最终是否会支持相反的方案,让旧的类库引用 ASP.NET 5 库?我知道这可以更多地手动完成,但如果可能的话,能够让所有东西在混合解决方案中一起发挥作用会很好。
    • @Adam 不确定 net45 目标框架的工作方式与 aspnet5 的工作方式如何工作。也许在未来?用这个可能有趣的问题开始另一个问题。 :)
    【解决方案2】:

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

    dnu 命令代表(.NET Development Utility)

    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

    【讨论】:

      【解决方案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 项目中引用它。

      【讨论】:

        【解决方案4】:

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

        类似:

        #if ASPNET50 
         using class2
        #endif
        

        当您在通话中使用它时,您也需要这样做。

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

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多