问题描述
我想在 c++/cli 项目中使用托管的 nuget 包。有没有办法做到这一点?
例如我的场景几乎是这样的:
我创建了一个 C# 项目 (MainProject) 并将 EntityFramework nuget 包添加到该项目中。
我又创建了一个 C# 项目 (TestCSProject) 并添加了 MainProject 作为对该项目的引用。然后在引用中自动添加实体框架
我已经创建了一个 C++/CLI 项目(TestCLIProject)并添加了 MainProject 作为该项目的引用,以便我想看看我是否可以使用实体框架。
但这并没有发生。
所以我想知道如何在 c++/cli 项目中使用托管 nuget 包
解决方法
C++/CLI 项目可以使用 packages.config
使用 nuget 包(在 VS2019 中仍然没有对 C++ 的 PackageReference 支持,PackageReference for NuGet packages in C++ projects)。正如评论中所指出的,C++/CLI 应该仅用于与本机代码的互操作。无论如何,有时可能需要在这里使用 nuget 包。
在 Visual Studio 2019 中,以下对我来说适用于引用 .Net Framework 的 C++ 项目:
- 转到包管理器控制台:
Tools
->NuGet Package Manager
->Package Manager Console
。然后安装 nuget 包(instruction from Microsoft)。例如。 EF nuget 安装可能类似于:
Install-Package EntityFramework -Version 6.4.4 -ProjectName TestCLIProject
nuget 安装后,将在项目文件夹中创建一个 packages.config
文件并将其添加到项目中。例如。 EF nuget 安装packages.config 后可能是这样的:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="EntityFramework" version="6.4.4" targetFramework="native" />
</packages>
- 从 nuget 添加对 dll 的引用。
Project
->Add Reference...
->Browse...
-> 找到解决方案的文件夹 -> 转到packages
文件夹 -> 转到 nuget 的文件夹 -> 找到 dll(s)
例如对于 EF,这导致 .vcxproj 更新为:
<Reference Include="EntityFramework">
<HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.dll</HintPath>
</Reference>
<Reference Include="EntityFramework.SqlServer">
<HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.SqlServer.dll</HintPath>
</Reference>
- 项目已准备好构建。如果 Visual Studio 已选择退出
Tools
->Options
->NuGet Package Manager
->Automatically check for missing packages during build in Visual Studio
,则可以手动恢复 nugets,例如在包管理器控制台中使用Update-Package
命令。