Я пытаюсь создать пакет NuGet для сборки .Net, которая выполняет вызов собственной библиотеки DLL win32. Мне нужно упаковать как сборку, так и собственную dll со сборкой, добавленной в ссылки проекта (в этой части проблем нет), а собственная dll должна быть скопирована в выходной каталог проекта или какой-либо другой относительный каталог.
Мои вопросы:
- Как упаковать родную dll без попытки Visual Studio добавить ее в список ссылок?
- Должен ли я писать install.ps1 для копирования родной dll? Если да, то как я могу получить доступ к содержимому пакета для его копирования?
nuget
nuget-package
nuget-spec
AlonFStackoverflow
источник
источник
Ответы:
Использование
Copy
цели в целевом файле для копирования необходимых библиотек не приведет к копированию этих файлов в другие проекты, которые ссылаются на проект, в результате чего файлDllNotFoundException
. Это можно сделать с помощью гораздо более простого файла целей, используяNone
элемент, поскольку MSBuild скопирует всеNone
файлы в ссылающиеся проекты.Добавьте целевой файл в
build
каталог пакета nuget вместе с необходимыми собственными библиотеками. Целевой файл будет включать всеdll
файлы во всех дочерних каталогахbuild
каталога. Таким образом, чтобы добавитьx86
иx64
версию собственной библиотеки, используемойAny CPU
управляемой сборкой, вы получите структуру каталогов, подобную следующей:То же самое
x86
иx64
каталоги будут создаваться в выходном каталоге проекта при встраивании. Если вам не нужны подкаталоги то**
и%(RecursiveDir)
могут быть удалены и вместо того, чтобы включать необходимые файлы вbuild
каталоге непосредственно. Таким же образом можно добавить и другие необходимые файлы содержимого.Файлы, добавленные
None
в качестве целевого файла, не будут отображаться в проекте при открытии в Visual Studio. Если вам интересно, почему я не используюContent
папку в nupkg, это потому, что нет возможности установитьCopyToOutputDirectory
элемент без использования сценария PowerShell (который будет запускаться только внутри Visual Studio, а не из командной строки, на серверах сборки или в других IDE и не поддерживается в проектах DNX project.json / xproj ), и я предпочитаю использовать aLink
для файлов, а не иметь дополнительную копию файлов в проекте.Обновление: хотя это также должно работать,
Content
а неNone
похоже, что в msbuild есть ошибка, поэтому файлы не будут копироваться в проекты, ссылающиеся на проекты, удаленные более чем на один шаг (например, proj1 -> proj2 -> proj3, proj3 не получит файлы из пакета NuGet proj1, но proj2 будет).источник
'$(MSBuildThisFileDirectory)' != '' And HasTrailingSlash('$(MSBuildThisFileDirectory)')
требуется? Я думал, чтоMSBuildThisFileDirectory
всегда установлен. Когда это было бы не так?**\*.dll
? Это копирует все.dll
файлы во все каталоги. Вы можете легко**\*.*
скопировать все дерево каталогов.Недавно у меня была такая же проблема, когда я пытался создать пакет NuGet EmguCV, включая как управляемые сборки, так и неуправляемые общие лирарии (которые также должны были быть помещены в
x86
подкаталог), которые необходимо было автоматически копировать в выходной каталог сборки после каждой сборки ,Вот решение, которое я придумал, которое полагается только на NuGet и MSBuild:
Поместите управляемые сборки в
/lib
каталог пакета (очевидная часть), а неуправляемые общие библиотеки и связанные файлы (например, пакеты .pdb) в/build
подкаталог (как описано в документации NuGet ).Переименуйте все неуправляемые
*.dll
окончания файлов на что-нибудь другое, например,*.dl_
чтобы NuGet не жаловался на предполагаемые сборки, размещенные в неправильном месте ( «Проблема: сборка вне папки lib.» ).Добавьте
<PackageName>.targets
в/build
подкаталог настраиваемый файл со следующим содержимым (описание см. Ниже):Приведенный выше
.targets
файл будет внедрен при установке пакета NuGet в файл целевого проекта и отвечает за копирование собственных библиотек в выходной каталог.<AvailableItemName Include="NativeBinary" />
добавляет новый элемент «Действие сборки» для проекта (который также становится доступным в раскрывающемся списке «Действие сборки» в Visual Studio).<NativeBinary Include="...
добавляет встроенные библиотеки, помещенные в/build/x86
текущий проект, и делает их доступными для настраиваемой цели, которая копирует эти файлы в выходной каталог.<TargetPath>x86</TargetPath>
добавляет настраиваемые метаданные к файлам и сообщает настраиваемой цели скопировать собственные файлы вx86
подкаталог фактического выходного каталога.<PrepareForRunDependsOn ...
Блок добавляет пользовательская цель в список целей сборка зависит, см Microsoft.Common.targets файл для деталей.Настраиваемая цель
CopyNativeBinaries
содержит две задачи копирования. Первый отвечает за копирование любых*.dl_
файлов в выходной каталог с изменением их расширения на исходное*.dll
. Второй просто копирует все остальное (например, любые*.pdb
файлы) в то же место. Это можно было бы заменить одной задачей копирования и скриптом install.ps1, который должен был переименовать все*.dl_
файлы во*.dll
время установки пакета.Однако это решение по-прежнему не будет копировать собственные двоичные файлы в выходной каталог другого проекта, ссылающегося на тот, который изначально включает пакет NuGet. Вам все равно придется ссылаться на пакет NuGet в своем «окончательном» проекте.
источник
DllNotFoundException
ошибку.<NoWarn>NU5100</NoWarn>
в файл проектаВот альтернатива, которая использует
.targets
для внедрения собственной библиотеки DLL в проект со следующими свойствами.Build action
знак равноNone
Copy to Output Directory
знак равноCopy if newer
Основное преимущество этого метода заключается в том, что собственная DLL копируется в
bin/
папку зависимых проектов транзитивно.См. Макет
.nuspec
файла:Вот
.targets
файл:Это вставляет,
MyNativeLib.dll
как если бы он был частью исходного проекта (но, что любопытно, файл не отображается в Visual Studio).Обратите внимание на
<Link>
элемент, который задает имя файла назначения вbin/
папке.источник
Content
наNone
?Если кто еще наткнется на это.
Имя
.targets
файла ДОЛЖНО совпадать с идентификатором пакета NuGet.Все остальное не сработает.
Кредиты идут по адресу : https://sushihangover.github.io/nuget-and-msbuild-targets/
Я должен был прочитать более внимательно, поскольку это фактически отмечено здесь. Мне потребовалось много времени ..
источник
Немного поздно, но я создал для этого пакет nuget.
Идея состоит в том, чтобы иметь дополнительную специальную папку в вашем пакете nuget. Я уверен, что вы уже знакомы с Lib и Content. Созданный мной пакет nuget ищет папку с именем Output и копирует все, что там есть, в папку вывода проекта.
Единственное, что вам нужно сделать, это добавить зависимость nuget к пакету http://www.nuget.org/packages/Baseclass.Contrib.Nuget.Output/
Я написал об этом сообщение в блоге: http://www.baseclass.ch/blog/Lists/Beitraege/Post.aspx?ID=6&mobile=0
источник
Есть чистое решение C #, которое я считаю довольно простым в использовании, и мне не нужно беспокоиться об ограничениях NuGet. Следуй этим шагам:
Включите собственную библиотеку в свой проект и установите для ее свойства Build Action значение
Embedded Resource
.Вставьте следующий код в класс, в котором вы вызываете эту библиотеку.
Вызовите этот метод из статического конструктора, как показано ниже,
UnpackNativeLibrary("win32");
и он распакует библиотеку на диск непосредственно перед тем, как она вам понадобится. Конечно, вы должны быть уверены, что у вас есть права на запись в эту часть диска.источник
Это старый вопрос, но сейчас у меня такая же проблема, и я нашел решение, которое немного сложно, но очень просто и эффективно: создайте в стандартной папке содержимого Nuget следующую структуру с одной подпапкой для каждой конфигурации:
Когда вы упаковываете файл nuspec, вы получите следующее сообщение для каждой собственной библиотеки в папках Debug и Release:
Нам не нужно такое «решение», потому что это и есть наша цель: чтобы собственные библиотеки не добавлялись как ссылки на NET Assemblies.
Преимущества:
К недостаткам можно отнести:
источник
Я не могу решить вашу проблему, но могу дать вам совет.
Ваше ключевое требование: «И пусть он не регистрирует ссылку автоматически» .....
Так что вам придется ознакомиться с «элементами решения»
См. Ссылку здесь:
Добавление элементов уровня решения в пакет NuGet
Вам нужно будет написать немного Powershell voodoo, чтобы получить копию вашей родной dll в свой дом (опять же, потому что вы НЕ хотите, чтобы вуду с автоматическим добавлением ссылки запускался)
Вот файл ps1, который я написал ... чтобы поместить файлы в папку сторонних ссылок.
Там достаточно, чтобы вы сообразили, как скопировать родную dll в какой-нибудь «дом» ... без необходимости начинать с нуля.
Опять же, это не прямое попадание, но это лучше, чем ничего.
источник
Положите это папка с содержимым
команда
nuget pack [projfile].csproj
сделает это за вас автоматически, если вы отметите файлы как содержимое.затем отредактируйте файл проекта, как указано здесь, добавив элемент ItemGroup & NativeLibs & None
работал на меня
источник