Visual Studio 正在寻找没有 publicKeyToken 的旧 Nuget 包
Visual Studio is looking for an old Nuget Package with no publicKeyToken
我的项目中有一个 Nuget 包,它之前未签名且没有强名称。
我已经发布了一个新版本的包,现在已经签名了。
当我将新版本的 Nuget 包添加到我的解决方案时,在项目中任何引用 Nuget 包中的程序集的地方,都会导致以下构建错误:
Error CS0012 The type 'JsonWebToken' is defined in an assembly that is
not referenced. You must add a reference to assembly
'TSC.Business.DataContracts, Version=2.10.6.0, Culture=neutral,
PublicKeyToken=null'.
如您所见,编译器仍需要一个没有 PublicKeyToken 的程序集版本。
我需要尝试找出为什么编译器仍期望此程序包的 publicKeyToken 为空。
我尝试过的事情 - 都没有运气:
通过从 packages.json、包目录、csproj 文件、bin 路径和 运行 中删除旧版本来完全卸载旧的 Nuget 包。
正在验证新版本的 publicKeyToken 在 packages.json 中是否正确 - 它是
正在清除我的临时 ASP.Net 文件
哎呀,甚至安装 VS2019 并检查那里是否存在问题 - 它的确如此
有人知道编译器还能在哪里寻找这个空的 publicKeyToken 吗?
在磁盘上查找 project.assets.json
,从项目目录开始。它可能在 obj
目录中。如果找到它,请删除它和所有其他名为 *.*proj.nuget.*
的文件。这些将在下一个版本中重新生成,希望可以正常工作。
NuGet 包在设计上是不可变的。这意味着包的内容(我的意思是包 ID 的特定版本)因任何原因而改变都是无效的。当您开始对程序集进行强名称签名时,您应该已经更改了包版本。我的猜测是你没有,如果这是正确的,你会收到错误,因为 NuGet 利用了包的不变性并积极缓存。
当您谈到 packages 文件夹时,我假设您指的是包含使用 packages.config
的项目的解决方案的解决方案包文件夹。 NuGet 还有一个全局包文件夹。如果您确实需要更改包版本的内容,则需要从全局包版本中删除旧内容。但是请记住,曾经恢复过第一个包的每个人都会遇到同样的问题,并且需要删除他们的全局包文件夹。因此,无论何时进行任何更改,更改包的版本都很重要。如果您需要在制作最终版本之前生成用于测试的包,请利用语义版本控制的预发布标签。
我错误地回答了我在其他答案中提出的问题,但实际上阅读了错误消息,很明显遇到的问题是由其他原因引起的,而不是你认为的那样。我决定保留我的另一个答案,因为我已经看到太多次人们试图更改他们已经用于测试的软件包版本的内容,并且不明白为什么他们在尝试使用更新的软件包时看不到他们的更改。无论如何,强名称签名的程序集只能在其他强名称签名的程序集上具有 references/dependencies,这意味着您的项目仍在引用一些未进行强名称签名的包(或者可能是项目引用,我不记得是否这可能发生在 packages.config
个项目中,但不应该发生在 PackageReference
中)。但正如错误消息所说,您的项目目前根本没有引用 TSC.Business.DataContracts, Version=2.10.6.0, Culture=neutral, PublicKeyToken=null
。
要快速找出您的项目使用的程序集没有强名称签名的一种方法是对项目进行强名称签名。虽然这意味着您使用的所有包都必须是强名称签名的,但如果您使用任何没有强名称签名的第三方包,这将不起作用。无论如何,如果你这样做,你会得到这个错误:
MSB3188: Assembly '<assembly>' must be strong signed in order to be marked
as a prerequisite.
您看到的错误是 "The type 'JsonWebToken' is defined in an assembly that is not referenced"。这意味着您正在引用一个程序集(我假设来自一个包),该程序集具有一个方法或 属性 returns 一个 JsonWebToken
类型的对象,并且在您的代码中您使用了 var jwt =
。这会导致您的项目对定义该类型的程序集具有程序集依赖性(不同于程序包依赖性),但定义该类型的程序集未使用 /r
参数传递给编译器。除非您是 运行 csc.exe 自己,否则这意味着您的项目未通过项目或包引用获取引用。
原因可能是使用的包没有正确声明其自身的 nuget 依赖项,或者您的项目可能正在使用 packages.config
并且有一个项目引用使用 TSC.Business.DataContracts, Version=2.10.6.0, Culture=neutral, PublicKeyToken=null
。如果您的项目使用 PackageReference
,那么所有依赖项都是可传递的,这意味着如果您引用一个使用包的项目,那么这些包也将自动对您的项目可用。我不认为 packages.config
项目也是如此,但我不确定 ResolveAssemblyReferences
是否发生在 运行 csc.exe.[= 之前或之后的构建中24=]
假设这是一个包问题,而不是一个传递项目引用问题,当包作者使用 nuspec 文件创建他们的包时会发生这种情况,因为它很容易出错。这就是为什么 NuGet 团队强烈推荐使用 SDK 风格的项目(它们可以针对 .NET Framework,它们不限于 .NET Core 和 .NET Standard)并使用没有 nuspec 的 dotnet pack
来自动打包所有内容。自动添加 NuGet 依赖项,因此根本不会发生此类包编写错误。如果您使用 nuspec 打包您的包,请考虑切换到 SDK 样式项目并停止使用 nuspec,否则请仔细检查您的包以确保它们具有正确的依赖项(nuget.exe pack
可以自动为包和项目引用添加 NuGet 依赖项, 但它更容易出错)。
也许我应该在这里停止我的消息,但还有另一种不太可能的可能性。我希望简要地解释它不会混淆而不是帮助。既然你说你在开始强名称签名时确实增加了包版本号,我希望这意味着你也增加了程序集版本号。如果是这样,那么您应该知道版本 2.10.6.0 是否需要强名称签名。如果它应该是,那么你在构建和打包 TSC.Business.DataContracts 时也有问题,或者你的项目使用的任何依赖于 TSC.Business.DataContracts 的包,因为很明显它使用的是 dll 的未签名版本。如果版本 2.10.6.0 是预签名版本,那么您的项目正在使用针对此旧版本 TSC.Business.DataContracts 编译的包,尽管该包错误地未能声明对任何包提供的 nuget 依赖性 TSC.Business.DataContracts.dll.
我的项目中有一个 Nuget 包,它之前未签名且没有强名称。
我已经发布了一个新版本的包,现在已经签名了。
当我将新版本的 Nuget 包添加到我的解决方案时,在项目中任何引用 Nuget 包中的程序集的地方,都会导致以下构建错误:
Error CS0012 The type 'JsonWebToken' is defined in an assembly that is not referenced. You must add a reference to assembly 'TSC.Business.DataContracts, Version=2.10.6.0, Culture=neutral, PublicKeyToken=null'.
如您所见,编译器仍需要一个没有 PublicKeyToken 的程序集版本。
我需要尝试找出为什么编译器仍期望此程序包的 publicKeyToken 为空。
我尝试过的事情 - 都没有运气:
通过从 packages.json、包目录、csproj 文件、bin 路径和 运行 中删除旧版本来完全卸载旧的 Nuget 包。
正在验证新版本的 publicKeyToken 在 packages.json 中是否正确 - 它是
正在清除我的临时 ASP.Net 文件
哎呀,甚至安装 VS2019 并检查那里是否存在问题 - 它的确如此
有人知道编译器还能在哪里寻找这个空的 publicKeyToken 吗?
在磁盘上查找 project.assets.json
,从项目目录开始。它可能在 obj
目录中。如果找到它,请删除它和所有其他名为 *.*proj.nuget.*
的文件。这些将在下一个版本中重新生成,希望可以正常工作。
NuGet 包在设计上是不可变的。这意味着包的内容(我的意思是包 ID 的特定版本)因任何原因而改变都是无效的。当您开始对程序集进行强名称签名时,您应该已经更改了包版本。我的猜测是你没有,如果这是正确的,你会收到错误,因为 NuGet 利用了包的不变性并积极缓存。
当您谈到 packages 文件夹时,我假设您指的是包含使用 packages.config
的项目的解决方案的解决方案包文件夹。 NuGet 还有一个全局包文件夹。如果您确实需要更改包版本的内容,则需要从全局包版本中删除旧内容。但是请记住,曾经恢复过第一个包的每个人都会遇到同样的问题,并且需要删除他们的全局包文件夹。因此,无论何时进行任何更改,更改包的版本都很重要。如果您需要在制作最终版本之前生成用于测试的包,请利用语义版本控制的预发布标签。
我错误地回答了我在其他答案中提出的问题,但实际上阅读了错误消息,很明显遇到的问题是由其他原因引起的,而不是你认为的那样。我决定保留我的另一个答案,因为我已经看到太多次人们试图更改他们已经用于测试的软件包版本的内容,并且不明白为什么他们在尝试使用更新的软件包时看不到他们的更改。无论如何,强名称签名的程序集只能在其他强名称签名的程序集上具有 references/dependencies,这意味着您的项目仍在引用一些未进行强名称签名的包(或者可能是项目引用,我不记得是否这可能发生在 packages.config
个项目中,但不应该发生在 PackageReference
中)。但正如错误消息所说,您的项目目前根本没有引用 TSC.Business.DataContracts, Version=2.10.6.0, Culture=neutral, PublicKeyToken=null
。
要快速找出您的项目使用的程序集没有强名称签名的一种方法是对项目进行强名称签名。虽然这意味着您使用的所有包都必须是强名称签名的,但如果您使用任何没有强名称签名的第三方包,这将不起作用。无论如何,如果你这样做,你会得到这个错误:
MSB3188: Assembly '<assembly>' must be strong signed in order to be marked as a prerequisite.
您看到的错误是 "The type 'JsonWebToken' is defined in an assembly that is not referenced"。这意味着您正在引用一个程序集(我假设来自一个包),该程序集具有一个方法或 属性 returns 一个 JsonWebToken
类型的对象,并且在您的代码中您使用了 var jwt =
。这会导致您的项目对定义该类型的程序集具有程序集依赖性(不同于程序包依赖性),但定义该类型的程序集未使用 /r
参数传递给编译器。除非您是 运行 csc.exe 自己,否则这意味着您的项目未通过项目或包引用获取引用。
原因可能是使用的包没有正确声明其自身的 nuget 依赖项,或者您的项目可能正在使用 packages.config
并且有一个项目引用使用 TSC.Business.DataContracts, Version=2.10.6.0, Culture=neutral, PublicKeyToken=null
。如果您的项目使用 PackageReference
,那么所有依赖项都是可传递的,这意味着如果您引用一个使用包的项目,那么这些包也将自动对您的项目可用。我不认为 packages.config
项目也是如此,但我不确定 ResolveAssemblyReferences
是否发生在 运行 csc.exe.[= 之前或之后的构建中24=]
假设这是一个包问题,而不是一个传递项目引用问题,当包作者使用 nuspec 文件创建他们的包时会发生这种情况,因为它很容易出错。这就是为什么 NuGet 团队强烈推荐使用 SDK 风格的项目(它们可以针对 .NET Framework,它们不限于 .NET Core 和 .NET Standard)并使用没有 nuspec 的 dotnet pack
来自动打包所有内容。自动添加 NuGet 依赖项,因此根本不会发生此类包编写错误。如果您使用 nuspec 打包您的包,请考虑切换到 SDK 样式项目并停止使用 nuspec,否则请仔细检查您的包以确保它们具有正确的依赖项(nuget.exe pack
可以自动为包和项目引用添加 NuGet 依赖项, 但它更容易出错)。
也许我应该在这里停止我的消息,但还有另一种不太可能的可能性。我希望简要地解释它不会混淆而不是帮助。既然你说你在开始强名称签名时确实增加了包版本号,我希望这意味着你也增加了程序集版本号。如果是这样,那么您应该知道版本 2.10.6.0 是否需要强名称签名。如果它应该是,那么你在构建和打包 TSC.Business.DataContracts 时也有问题,或者你的项目使用的任何依赖于 TSC.Business.DataContracts 的包,因为很明显它使用的是 dll 的未签名版本。如果版本 2.10.6.0 是预签名版本,那么您的项目正在使用针对此旧版本 TSC.Business.DataContracts 编译的包,尽管该包错误地未能声明对任何包提供的 nuget 依赖性 TSC.Business.DataContracts.dll.