Как добавить библиотеку C ++ в проект .NET Core

Как добавить библиотеку C ++ в проект .NET Core (библиотека классов). Я пытался создать пакет nuget, но не работает. Я получил эту ошибку:

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

Когда я добавляю пакет nuget, в project.json добавляется следующая ссылка:

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

9

Решение

зависимости приписывать project.json определяет зависимости пакета, из-за этого NuGet обрабатывает NameOfDll.dll как идентификатор пакета, но не как имя DLL.

Чтобы добавить нативные библиотеки C ++ в ваш пакет NuGet для .xproj В библиотеке вы должны сделать следующие шаги:

  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 ++ в ваш пакет NuGet для .csproj В библиотеке вы должны сделать следующие шаги:

  1. Я предполагаю, что вы управляли проектом с именем MyClassLibrary.csproj,
  2. Создайте новый пакет NuGet для вашей библиотеки классов с nuget spec команда.
  3. Создайте \lib, \build, \content а также \tools каталоги рядом MyClassLibrary.nuspec,
  4. Скопируйте все ваши родные библиотеки в \build папка.
  5. Изменить расширение скопированных родных библиотек на .native,
  6. Создайте MyClassLibrary.targets со следующим содержанием внутри \build папка:

    <?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.

9

Другие решения

Вот способ сделать это одним щелчком мыши в .net core 2. Я использовал его на своем веб-сайте, и он работает.

Щелкните правой кнопкой мыши свой проект в обозревателе решений, выберите «Добавить» -> «Существующий элемент», найдите и выберите свою DLL (выберите «Показать все расширения»). Тогда ваша DLL появится в Solution Explorer.

В обозревателе решений щелкните правой кнопкой мыши свою dll -> Свойства. Установить действие сборки: Содержимое и Копировать в выходной каталог: Копировать, если новее (или всегда копировать).

Это сделано. Используйте вашу dll в вашем коде, просто так:

[DllImport («my_dll.dll», CallingConvention = CallingConvention.Cdecl)]
0