Использование пакета nuget, созданного с помощью .nuspec и .targets (C )

#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 в папку сборки, он подберет его независимо от используемой платформы. Большое спасибо за ваш подробный ответ