Как добавить библиотеку 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"},
зависимости приписывать project.json
определяет зависимости пакета, из-за этого NuGet обрабатывает NameOfDll.dll
как идентификатор пакета, но не как имя DLL.
Чтобы добавить нативные библиотеки C ++ в ваш пакет NuGet для .xproj
В библиотеке вы должны сделать следующие шаги:
NameOfDll.dll
в \lib
каталог рядом MyClassLibrary.xproj
открыто project.json
файл и добавьте туда:
"packOptions": {
"files" : {
"includeFiles" : "lib/NameOfDll.dll"}
}
казнить dotnet pack
NameOfDll.dll
будет включен в пакет NuGet по пути lib\NameOfDll.dll
,
Чтобы добавить нативные библиотеки C ++ в ваш пакет NuGet для .csproj
В библиотеке вы должны сделать следующие шаги:
MyClassLibrary.csproj
,nuget spec
команда.\lib
, \build
, \content
а также \tools
каталоги рядом MyClassLibrary.nuspec
,\build
папка..native
,Создайте 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 в целевой файл проекта.
Добавьте следующие строки в ваш MyClassLibrary.nuspec
:
<files>
<file src="lib\" target="lib" />
<file src="tools\" target="tools" />
<file src="content\" target="content" />
<file src="build\" target="build" />
</files>
казнить nuget pack MyClassLibrary.csproj
построить свой пакет NuGet.
Вот способ сделать это одним щелчком мыши в .net core 2. Я использовал его на своем веб-сайте, и он работает.
Щелкните правой кнопкой мыши свой проект в обозревателе решений, выберите «Добавить» -> «Существующий элемент», найдите и выберите свою DLL (выберите «Показать все расширения»). Тогда ваша DLL появится в Solution Explorer.
В обозревателе решений щелкните правой кнопкой мыши свою dll -> Свойства. Установить действие сборки: Содержимое и Копировать в выходной каталог: Копировать, если новее (или всегда копировать).
Это сделано. Используйте вашу dll в вашем коде, просто так:
[DllImport («my_dll.dll», CallingConvention = CallingConvention.Cdecl)]