#c# #c #visual-studio #nuget #nuspec
#c# #c #visual-studio #nuget #nuspec
Вопрос:
Изо всех сил пытаюсь получить скомпилированную c dll (как x86, так и x64), упакованную так, чтобы библиотека C # могла ее использовать.
Удалось упаковать и отправить dll с помощью файла nuspec, однако при использовании диспетчера пакетов VS2019 он успешно устанавливает пакет, однако ссылка не отображается. (Любой процессор)
.nuspec
<?xml version="1.0"?>
<package >
<metadata>
<id>component1</id>
<version>1.0.0</version>
<description>mycomponent</description>
<authors>Me</authors>
</metadata>
<files>
<file src="32component1.dll" target="buildx86" />
<file src="64component1.dll" target="buildx64" />
<file src="component1.targets" target="libnet40" />
</files>
</package>
Поскольку потребляющий проект нацелен на .NET 4.0, я создал файл component1.targets, указывающий на ту же платформу
.targets
<ItemGroup Condition=" '$(Platform)' == 'x64' ">
<Reference Include="component1">
<HintPath>"$(MSBuildThisFileDirectory)....buildx64component1.dll"</HintPath>
</Reference>
</ItemGroup>
<ItemGroup Condition=" '$(Platform)' == 'x86' OR '$(Platform)' == 'AnyCPU' OR '$(Platform)' == 'Any CPU' ">
<Reference Include="component1">
<HintPath>$(MSBuildThisFileDirectory)....buildx32component1.dll</HintPath>
</Reference>
</ItemGroup>
Комментарии:
1.
$(Platform)' == 'AnyCPU'
объявленный дважды, также у вас естьtarget="buildx86"
в файлах пакета, ноbuildx32
вItemGroup
2. Вам также может понадобиться itemgroup в вашем файле csproj для копирования собственной библиотеки dll в выходной каталог.
3. Привет, Гамби, если мой ответ поможет вам решить проблему, пожалуйста, не забудьте принять его .
4. Привет, Гамби, есть какие-либо обновления по этой проблеме?
Ответ №1:
Ваши шаги в беспорядке.
Следует отметить, что целевой файл должен иметь имя <package_id>.targets`, то же имя, что и идентификатор пакета nuget, иначе он не сможет работать. Смотрите эту ссылку.
Кроме того, файл targets должен быть помещен в build
папку nupkg.
Это два важных совета.
1) Пожалуйста, измените ваш nuspec
файл на этот:
<?xml version="1.0"?>
<package >
<metadata>
<id>component1</id>
<version>1.0.0</version>
<description>mycomponent</description>
<authors>Me</authors>
</metadata>
<files>
<file src="32component1.dll" target="buildx86" />
<file src="64component1.dll" target="buildx64" />
<file src="component1.targets" target="build" />
</files>
</package>
2) Затем измените свой component1.targets
на эти:
Вы должны удалить ""
under "$(MSBuildThisFileDirectory)....buildx64component1.dll"
.
<Project>
<ItemGroup Condition=" '$(Platform)' == 'x64' ">
<Reference Include="component1">
<HintPath>$(MSBuildThisFileDirectory)..buildx64component1.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup Condition=" '$(Platform)' == 'x86' OR '$(Platform)' == 'AnyCPU' OR '$(Platform)' == 'Any CPU' ">
<Reference Include="component1">
<HintPath>$(MSBuildThisFileDirectory)..buildx32component1.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
3) используется nuget pack
для переупаковки пакета nuget. И перед установкой этой новой версии пакета nuget, пожалуйста, сначала очистите кэш nuget или просто удалите все файлы C:Usersxxx(current user name).nugetpackages
.
И это хорошо работает на моей стороне.
Вызывается мой пакет nuget testt
, и я ссылаюсь ClassLibrary21.dll
на x64
него .
Комментарии:
1. Это сработало, но я подумал, что мне придется ориентироваться на версию framework. Я предполагаю, что, поместив файл .targets в папку сборки, он подберет его независимо от используемой платформы. Большое спасибо за ваш подробный ответ