Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NuGet不';t更新项目中的dll引用_C#_Nuget_Nuspec_Nuget Update - Fatal编程技术网

C# NuGet不';t更新项目中的dll引用

C# NuGet不';t更新项目中的dll引用,c#,nuget,nuspec,nuget-update,C#,Nuget,Nuspec,Nuget Update,我的nuspec中有以下结构: <package> <metadata> <references> <reference file="A.dll"/> </references> </metadata> <files> <file src="A.dll" target="lib\net40\A.dll"/> <file src="B.dll

我的nuspec中有以下结构:

<package>
  <metadata>
    <references>
      <reference file="A.dll"/>
    </references>
  </metadata>
  <files>
    <file src="A.dll" target="lib\net40\A.dll"/>
    <file src="B.dll" target="lib\net40\B.dll"/>
  </files>
</package>

我没有在引用中包含
B.dll
,因为用户可以选择将其添加为引用

现在,当我执行
updatepackage
时,它会将路径更新为
A.dll
,但当您将其添加为引用时,它不会更新为
B.dll

如何保持
B.dll
作为可选的
lib
文件,但在更新NuGet包时仍使其更新


我正在使用Visual Studio 2013软件包管理器控制台。

我在以下链接的安装脚本中找到了一个解决方法:

我不得不通过反复试验进行一些修改,最后做出了以下更改:

# removed the + sign in *?\\ and removed the double trailing backslash
$newHintPath = $hintPath -replace "$packageId.*?\\", "$packageName\"
最后的脚本现在如下所示:

$packageName = $package.Id + '.' + $package.Version;
$packageId = $package.Id;

# Full assembly name is required
Add-Type -AssemblyName 'Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
$projectCollection = [Microsoft.Build.Evaluation.ProjectCollection]::GlobalProjectCollection

# There is no indexer on ICollection<T> and we cannot call
# Enumerable.First<T> because Powershell does not support it easily and
# we do not want to end up MethodInfo.MakeGenericMethod.
$allProjects = $projectCollection.GetLoadedProjects($project.Object.Project.FullName).GetEnumerator(); 

Write-Host "Replace hint paths in project"
if($allProjects.MoveNext())
{
    foreach($item in $allProjects.Current.GetItems("Reference"))
    {
        $hintPath = $item.GetMetadataValue("HintPath")

        $newHintPath = $hintPath -replace "$packageId.*?\\", "$packageName\"

        if($hintPath -ne $newHintPath)
        {
            Write-Host "Updating $hintPath to $newHintPath"
            $item.SetMetadataValue("HintPath", $newHintPath);
        }
    }
}
$packageName=$package.Id+'.+$package.Version;
$packageId=$package.Id;
#需要完整的程序集名称
添加类型-AssemblyName“Microsoft.Build,版本=4.0.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a”
$projectCollection=[Microsoft.Build.Evaluation.projectCollection]::GlobalProjectCollection
#ICollection上没有索引器,我们无法调用
#可枚举。首先是因为Powershell不支持它,而且
#我们不希望以MethodInfo.MakeGenericMethod结束。
$allProjects=$projectCollection.GetLoadedProjects($project.Object.project.FullName).GetEnumerator();
写入主机“替换项目中的提示路径”
if($allProjects.MoveNext())
{
foreach($allProjects.Current.GetItems(“参考”)中的项)
{
$hintPath=$item.GetMetadataValue(“hintPath”)
$newHintPath=$hintPath-替换“$packageId.*?\”,“$packageName\”
if($hintPath-ne$newHintPath)
{
写入主机“将$hintPath更新为$newHintPath”
$item.SetMetadataValue(“HintPath”、$newHintPath);
}
}
}

Hmm,您的微优化太多了,从编译时中节省几毫秒的时间是没有人注意到的。而且需要一本手册。始终添加引用或将其作为单独的包。