如何在.net Core项目中添加c++库

How to add C++ library in a .NET Core project

本文关键字:添加 c++ 项目 Core net      更新时间:2023-10-16

如何在。net Core项目中添加c++库(类库)。我试着创建一个nuget包,但不工作。我得到了这个错误:

An unhandled exception of type 'System.DllNotFoundException' occurred in "NameOfDll.dll"

当我添加nuget包的项目。Json添加以下引用:

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

dependencies属性在project.json指定包依赖,因为这个NuGet处理NameOfDll.dll作为一个包ID,而不是作为一个dll名。

要在.xproj库的NuGet包中添加本地c++ dll,您应该执行以下步骤:

  1. NameOfDll.dll放到lib目录下,MyClassLibrary.xproj附近
  2. 打开project.json文件并添加:

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

NameOfDll.dll将包含在路径libNameOfDll.dll下的NuGet包中。

要在.csproj库的NuGet包中添加本地c++ dll,您应该执行以下步骤:

  1. 我假设你管理的项目名称为MyClassLibrary.csproj
  2. nuget spec命令为你的类库创建新的NuGet包
  3. MyClassLibrary.nuspec附近创建lib, build, contenttools目录。
  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内容取自本题。上面的.targets文件将在安装NuGet包时注入到目标项目文件中。

  7. MyClassLibrary.nuspec中添加以下行:

    <files>
      <file src="lib" target="lib" />
      <file src="tools" target="tools" />
      <file src="content" target="content" />
      <file src="build" target="build" />
    </files>
    
  8. 执行nuget pack MyClassLibrary.csproj构建NuGet包

这是在。net core 2中一键完成的方法。我用它在我的网站,它的工作。

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

在解决方案资源管理器中,右键单击您的dll ->属性。设置构建操作:Content,并Copy到Output Directory: Copy if newer(或始终复制)。

完成。在代码中直接使用dll,如下所示:

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