在.NET 4.6项目中引用一个.NET Core库

59

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

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

我理解错了吗?

这是我在.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"
  }
}

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - GregoryHouseMD
我将net451更改为net46,但没有起到作用。我刚刚创建了一个新的解决方案,其中包含一个新的空NET Core库和一个新的空“普通”的.NET 4.6类库。我仍然收到相同的错误信息... - Roman L.
我不认为你想做的事情受到支持。你不能一起迁移其他库吗? - GregoryHouseMD
我目前在使用RC1时遇到了一些问题,但是在Beta8中,我通过创建一个NuGet包并从.NET 4.6项目中管理该NuGet包来使其工作。目前,我正在尝试找出dotnet5.4和dnxcore50之间的区别。 - Chad Carter
@Chad Carter - 昨天我升级到RC1后也正在尝试弄清楚同样的事情。根据https://github.com/aspnet/Announcements/issues/98,"类库"应该使用net451和dotnet5.4代替旧的dnx451/dnxcore50,因此他们更新了VS模板以反映这一点。 然而,“应用程序”仍应针对dnx *标记,但由于不同的框架目标,这会在应用程序和类库包之间创建不兼容性。我不理解微软到底希望我们在这里做些什么。 - Aerendel
1
我在使用.NET 4.6.1作为主项目和一个.NET Core库(dotnet5.4)时遇到了相同的问题。 - Mohsen Afshin
5个回答

23

现在可以使用 .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文件中增加版本号,以确保其他应用程序看到更新。


10
它可以工作,但是体验太糟糕了。这不是承诺中的“csproj可以引用xproj”。除非工具已经完成预览,否则几乎没有做这件事情的价值。 - mwijnands
我认为你可能不需要那个额外的 net451 框架。 - Asad Saeeduddin
我尝试过这样做,但在调试时有点令人沮丧,因为它不总是从包中加载所有调试信息。而且它也很糟糕,因为你必须不断更新包的版本号,否则NuGet包缓存就无法获取最新版本。然后,在逐行调试时,它会抱怨找不到要进入的源代码。 - Kevin
2
创建一个NuGet包并不是必需的...一旦您添加了所需的框架并进行构建,您可以直接从您的.NET 4.6应用程序引用.NET CORE项目。 - Jeremy Holovacs
这个答案是否相关? - Akmal Salikhov
如果 .NET Framework 引用了它无法使用的核心,则无法使用本机。 - lindexi

9

答案显示在演示文稿中。

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


10
我现在使用的是RC 2版本,但仍然看到相同的错误。 - Asad Saeeduddin

7

将你的类库(和任何依赖项)更改为同时构建针对4.6版本和.NET Core;

Change class library to build

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

Debug folder with both builds

在你的.NET 4.6项目(App)中,直接引用在debug文件夹中找到的类库的DLL文件

Add direct reference

现在你可以导入这个命名空间并开始构建。尽管ReSharper (2016.3 EAP 2)似乎会混淆并将这些行标记为红色 - 这是一个临时措施,直到之后的.NET版本发布。

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

enter image description here

注:构建代码dnx462似乎不起作用,抱怨.NET框架没有安装,尽管该项目有一个4.6.2 WPF App。


1
看起来这个.NET 4.6 DLL的路径是绝对路径。这是否意味着项目的另一个贡献者需要创建一个完全相同的文件夹层次结构来匹配引用,以便使用该引用?还是引用会自动更新? - Kevin
1
我已经更新了我的答案,你可以看到它是一个相对路径。 - wonea

4
我也曾经为此苦苦挣扎,但是我找到了比繁琐的NuGet包解决方案更好的解决方案。我在Stackify上找到了这篇文章。这篇文章仅讨论了使用单独的解决方案,但是只使用一个解决方案非常容易。
.NET项目的分离解决方案
这个选项需要两个解决方案文件以及每个项目使用.NET核心和.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版本。
最后的想法
我发现这个解决方案比NuGet包选项好多了。唯一需要考虑的小事情是所有对任何引用、NuGet包或任何新文件的修改都必须添加到两个项目中。虽然如此,但这是避免可怕的NuGet包选项所付出的小代价。让我们祈祷VS团队能尽快让.xproj引用在.cspoj文件中起作用。

我知道我不应该发布链接,但我想表扬一下作者。 http://stackify.com/using-both-xproj-and-csproj-with-net-core/


该文章介绍了如何在使用.Net Core时同时使用xproj和csproj文件。

3

我发现了一个非常简单的解决方案,如果你不介意在 Debug 或 Release 中硬编码引用。你只需要在 csproj 文件中手动添加对 xproj 的引用即可。以下是操作步骤:

  1. Ensure that your csproj is using at least one nuget package. Most projects do, so this is not a problem.
  2. In Visual Studio, unload your csproj project
  3. In Visual Studio, right-click on the csproj file and choose "edit"
  4. Find the part in the csproj project file where you are referencing a nuget package. Ah... here's one:

        <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. Copy this and modify it to reference the DLL produced by your xproj project, like so:

     <Reference Include="HighFive.Server.Web"> 
         <HintPath>..\HighFive.Server.Web\bin\Debug\net461\HighFive.Server.Web.dll</HintPath>
         <Private>True</Private>
     </Reference>
    
  6. Save and close the csproj file
  7. Reload the project
  8. Rebuild all
  9. Presto!

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


2
我已经能够使用$(Configuration)代替Debug,它会自动选择Debug\Release版本,因此HintPath看起来像...\bin\$(Configuration)\net461\...。另外,值得注意的是,设置项目依赖关系可以强制先构建.NET Core项目再构建其他项目。 - Samuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接