如何在.NET Core项目中添加C++库

17

如何在.NET Core项目(类库)中添加C++库?我尝试创建NuGet包但失败了,出现了以下错误:

未处理的异常类型 'System.DllNotFoundException' 出现在 "NameOfDll.dll"

当我添加NuGet包时,project.json会添加以下引用:

  "dependencies": {
    "Core": "1.0.0-*",
    "NETStandard.Library": "1.6.0",
    "NameOfDll.dll": "1.0.0"
  },
2个回答

13

project.json 中的 dependencies 属性指定了包依赖关系,因此 NuGet 会将 NameOfDll.dll 视为包 ID 而不是 dll 文件名。

要将本机 C++ dll 添加到您的 .xproj 库的 NuGet 包中,请执行以下步骤:

  1. 将您的 NameOfDll.dll 放置在 \lib 目录中,与 MyClassLibrary.xproj 相邻。
  2. 打开 project.json 文件并添加以下内容:

    "packOptions": {
      "files" : {
        "includeFiles" : "lib/NameOfDll.dll"
      }
    }
    
  3. 执行dotnet pack

NameOfDll.dll会被包含在NuGet包中的路径为lib\NameOfDll.dll.

要将本地C++ dll添加到.csproj库的NuGet包中,您需要执行以下步骤:

  1. 假设您有一个名为MyClassLibrary.csproj的托管项目。
  2. 使用nuget spec命令为类库创建新的NuGet包。
  3. MyClassLibrary.nuspec旁边创建\lib\build\content\tools目录。
  4. 将所有本地dll复制到\build文件夹中。
  5. 将已复制的本地dll的扩展名更改为.native
  6. \build文件夹内创建MyClassLibrary.targets文件,并添加以下内容:

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <ItemGroup>
        <AvailableItemName Include="NativeBinary" />
      </ItemGroup>
      <ItemGroup>
        <NativeBinary Include="$(MSBuildThisFileDirectory)*">
          <TargetPath></TargetPath>
        </NativeBinary>
      </ItemGroup>
      <PropertyGroup>
        <PrepareForRunDependsOn>
          $(PrepareForRunDependsOn);
          CopyNativeBinaries
        </PrepareForRunDependsOn>
      </PropertyGroup>
      <Target Name="CopyNativeBinaries" DependsOnTargets="CopyFilesToOutputDirectory">
        <Copy SourceFiles="@(NativeBinary)"
              DestinationFiles="@(NativeBinary->'$(OutDir)\%(TargetPath)\%(Filename).dll')"
              Condition="'%(Extension)'=='.native'">
          <Output TaskParameter="DestinationFiles" ItemName="FileWrites" />
        </Copy>
        <Copy SourceFiles="@(NativeBinary)"
              DestinationFiles="@(NativeBinary->'$(OutDir)\%(TargetPath)\%(Filename).%(Extension)')"
              Condition="'%(Extension)'!='.native'">
          <Output TaskParameter="DestinationFiles" ItemName="FileWrites" />
        </Copy>
      </Target>
    </Project>
    

    提示.targets 内容摘自此问题。 安装NuGet包时,上述.targets文件将被注入到目标项目文件中。

  7. 将以下行添加到您的MyClassLibrary.nuspec中:

  8. <files>
      <file src="lib\" target="lib" />
      <file src="tools\" target="tools" />
      <file src="content\" target="content" />
      <file src="build\" target="build" />
    </files>
    
  9. 执行nuget pack MyClassLibrary.csproj命令来构建你的NuGet包。


嗨@gemr1423!这解决了你的问题还是你需要更多的帮助? - Nikita
2
感谢您的帮助,@Nikita。 - gemr1423
当我在macOS 10.12上尝试使用.csproj时,出现了“未实现的方法或操作”错误。 $ nuget pack MyClassLibrary.csproj 尝试从MyClassLibrary.csproj构建包。 System.NotImplementedException:未实现的方法或操作。 - Anish
我的 macOS nuget 包制作工具版本从 2.12.0.0 升级到 4.1.0.2450 后,修复了上述错误 _(但是我遇到了另一个错误)_。 - Anish
如果 nuget pack MyClassLibrary.csproj 无法正常工作,那么我们可以尝试使用 dotnet pack MyClassLibrary.csproj - Anish
显示剩余5条评论

3

这是在.net core 2中一种一键完成的方法。我在我的网站上使用过它,它有效。

在解决方案资源管理器中右键单击您的项目,选择添加->现有项,浏览并选择您的dll(选择显示所有扩展名)。然后您的dll将出现在解决方案资源管理器中。

在解决方案资源管理器中,右键单击您的dll->属性。设置生成操作:内容,并将复制到输出目录:如果较新则复制(或始终复制)。

完成了。像这样直接在您的代码中使用您的dll:

[DllImport("my_dll.dll", CallingConvention = CallingConvention.Cdecl)]

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