【问题标题】:Reference a .NET Core Library in a .NET 4.6 project在 .NET 4.6 项目中引用 .NET Core 库
【发布时间】:2015-11-19 17:27:00
【问题描述】:

也许我对“.NET Core Library”的含义有误解,但是当我尝试使用 Visual Studio 2015 在 .NET 4.6 程序集中添加 .NET Core 库时,我收到了错误:

无法添加对“...”的引用。

我理解错了吗?

这是我在 .NET Core 程序集的 project.json 中配置的

"frameworks": {
   "net451": { },
   "dotnet5.4": {
     "dependencies": {
     "Microsoft.CSharp": "4.0.1-beta-23516",
     "System.Collections": "4.0.11-beta-23516",
     "System.Linq": "4.0.1-beta-23516",
     "System.Runtime": "4.0.21-beta-23516",
     "System.Threading": "4.0.11-beta-23516"
  }
}

【问题讨论】:

  • 首先,将"net451" 更改为"net46",以便使用.NET 4.6。其次,确保您添加引用的项目使用相同的框架。 MVC 使用dnx451
  • 我将 net451 更改为 net46。没有帮助。我刚刚创建了一个新的解决方案,其中包含一个新的空 NET Core 库和一个新的空“普通”.NET 4.6 类库。我仍然得到同样的错误......
  • 我不认为你想做的事情得到支持。不能也迁移其他库吗?
  • 我目前遇到了 RC1 的一些问题,但在 Beta8 中,我通过创建一个 nuget 包然后从 .net 4.6 项目管理该 nuget 包来实现这一点。目前,我正在尝试找出 dotnet5.4 和 dnxcore50 之间的区别。
  • 我在使用 .NET 4.6.1 作为主项目和 .NET Core 库 (dotnet5.4) 时遇到同样的问题

标签: c# .net


【解决方案1】:

现在可以使用 .Net Core RC2 来完成。方法如下:

  1. 确保您的 .Net RC2 项目的 project.json 配置为包含相关的 .net 框架。例如,本节引用 .Net 4.51,任何等于或高于此版本的框架都可以引用它:

例子:

"frameworks": {
  "net451": { },
  "netstandard1.5": {
  "dependencies": {
    "NETStandard.Library": "1.5.0-rc2-24027"
  },
  "imports": [
    "portable-net45+wp80+win8+wpa81+dnxcore50",
    "portable-net451+win8"
  ]
 }
},
  1. 将您的 RC2 应用程序打包为 Nuget 包。我还没有看到如何从 Visual Studio 执行此操作,但可以从命令行执行:

    dotnet pack -o e:\packages

如果您想在每次构建时更新它,您可以将以下内容添加到 project.json 文件中,该文件会自动将包更新到父目录中。:

"scripts": {
  "postcompile": [
    "dotnet pack --no-build --configuration Debug -o ..//..//..//packages"
]}
  1. 将 Nuget 包添加到您的 .net 4.6 应用程序中。这可以通过多种方式完成。一种简单的方法是将保存包的位置添加为包源引用。

  2. 每次构建时增加 project.json 文件中的版本号,以确保您的其他应用程序看到更新。

【讨论】:

  • 它有效,但体验太糟糕了。这不是承诺的“csproj 可以引用 xproj”。在工具退出预览版之前几乎不值得这样做。
  • 我想你可能不需要那个额外的net451 框架。
  • 我试过这个,但是在调试时有点令人沮丧,因为它并不总是从包中加载所有调试信息。这也很糟糕,因为您必须不断更新包的版本号,否则 nuget 包缓存将无法获取最新版本。然后它抱怨它在进行逐行调试时找不到要进入的源代码。
  • 不需要创建 nuget 包...一旦添加了必要的框架并构建,您就可以直接从 .NET 4.6 应用程序中引用 .NET CORE 项目。
  • 这个答案是否相关?
【解决方案2】:

答案显示在演示文稿中

仅在尚未发布的 ASP.NET Core RC 2 中,将添加对 csproj 中引用 xproj 的支持。

【讨论】:

  • 我现在在 RC 2 上,但我仍然看到同样的错误。
【解决方案3】:

更改您的类库(和任何依赖项)以针对 4.6 以及 .NET Core 构建;

这将为您构建两个版本的类库。

在您的 .NET 4.6 项目 (App) 中,然后添加对调试文件夹中类库 DLL 的直接引用

您现在可以导入此命名空间,并根据它进行构建。尽管 ReSharper (2016.3 EAP 2) 似乎感到困惑并将这些行标记为红色 - 在以后的 .NET 版本之前,这是一个权宜之计。

如果您打开应用程序项目文件 (.csproj),您会看到框架添加的引用。

注意:构建代码 dnx462 似乎不起作用,抱怨未安装 .NET 框架,即使该项目具有 4.6.2 WPF 应用程序。

【讨论】:

  • 看起来这个 .NET 4.6 DLL 的路径是一个绝对路径。这是否意味着该项目的另一个贡献者需要创建一个完全重复的文件夹层次结构来匹配这个才能使用引用或引用自动更新?
  • 我已经更新了我的答案,你可以看到它是一个相对路径。
【解决方案4】:

我也一直在为此苦苦挣扎,但找到了比繁琐的 nuget 包解决方案更好的解决方案。我在 Stackify 上找到了这个。这篇文章只讨论了有一个单独的解决方案,但只使用一个解决方案很容易。

.NET 项目的单独解决方案

此选项需要使用 .NET core 和 .NET 4.x.x 为每个项目提供两个解决方案文件和两个项目文件。首先创建一个新的空白溶液。接下来创建一个新的 Windows“类库”(此时你命名它并不重要)。从解决方案中删除它,以便您可以编辑 .csproj 文件。打开 .csproj 文件并将 AssemblyName XML 元素更改为 .NET 核心项目程序集名称。您现在应该对项目进行任何其他与名称相关的更改。关闭 .csproj 并将其重命名为与 .xproj 文件相同的名称。将其复制到与 .xproj 文件相同的文件夹中。

现在您的新闪亮 .csproj 文件已准备就绪,这就是神奇之处。创建一个名为 ProjectName.project.json 的文件并将此文本添加到其中(根据需要修改 .net 框架)

{ "runtimes": { "win": {} }, "frameworks": { "net461": {} }}

在 .NET 4.x.x 解决方案中,重新加载此修改后的 .csproj 即可添加源文件。我发现最简单的方法是按“显示所有文件”,然后在每个文件/文件夹的右键单击上下文菜单中单击“包含在项目中”。现在尝试构建 .csproj,它应该可以正常构建。如果这不能正确构建,请尝试重新加载项目或重新启动 Visual Studio。

相同的解决方案,但有两个项目

这与上一个相同,但有一些关键区别。 .csproj 文件的名称必须不同于 .xproj 的名称(我只是添加了一个后缀,例如 MyProjectName.win.csprojMyProjectName.win.project.json)。这些可以添加到同一个解决方案中而不会发生名称冲突。您甚至可以让 .csproj 中的 AssemblyName 元素与 .NET 核心程序集名称相同,因为输出文件夹会根据 .NET 版本而变化

最后的想法

我发现这个解决方案比 nu-get 包选项好得多。唯一需要考虑的是对任何引用、nu-get 包或任何新文件的所有修改都必须添加到两个项目中;不过,要避免可怕的 nu-get 包选项,这是一个很小的代价。让我们拭目以待,希望 VS 团队能够尽快让 .cspoj 文件中的 .xproj 引用正常工作。

我知道我不应该发布链接,但是我想在应得的地方给予赞扬。 http://stackify.com/using-both-xproj-and-csproj-with-net-core/

【讨论】:

    【解决方案5】:

    如果您不介意硬编码对 Debug 或 Release 的引用,我找到了一个非常简单的解决方案。您只需在 csproj 文件中手动添加对 xproj 的引用。以下是你的做法:

    1. 确保您的 csproj 至少使用一个 nuget 包。大多数项目都这样做,所以这不是问题。
    2. 在 Visual Studio 中,卸载您的 csproj 项目
    3. 在 Visual Studio 中,右键单击 csproj 文件并选择“编辑”
    4. 在 csproj 项目文件中找到您引用 nuget 包的部分。啊...这是一个:

          <Reference Include="Microsoft.CodeAnalysis, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> 
             <HintPath>..\packages\Microsoft.CodeAnalysis.Common.1.3.0\lib\net45\Microsoft.CodeAnalysis.dll</HintPath>
             <Private>True</Private>
          </Reference>
      
    5. 复制并修改它以引用您的 xproj 项目生成的 DLL,如下所示:

       <Reference Include="HighFive.Server.Web"> 
           <HintPath>..\HighFive.Server.Web\bin\Debug\net461\HighFive.Server.Web.dll</HintPath>
           <Private>True</Private>
       </Reference>
      
    6. 保存并关闭 csproj 文件
    7. 重新加载项目
    8. 全部重建
    9. 快!

    关于硬编码 Debug 或 Release 参考:对于单元测试项目,这不是问题,因为您通常在调试模式下执行单元测试。我确信使用 MSBuild 参数可以使这更加智能,以避免硬编码,但我还不需要这样做。

    【讨论】:

    • 我已经能够使用 $(Configuration) 而不是 Debug 并且它选择了 Debug\Release 之一,因此 HintPath 看起来像 ...\bin\$(Configuration)\net461\...。此外,值得设置项目依赖项以强制 .NET 核心项目在其他项目之前构建。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 2017-06-21
    • 2018-05-01
    相关资源
    最近更新 更多