.NET Core发布的应用程序失败,出现FileNotFoundException异常。

7
我有一个使用netcoreapp2.1作为目标的.NET Core控制台应用程序。它使用Windows兼容性包调用现有的WCF服务。
当我通过Visual Studio运行它,或者使用“dotnet run”从命令行运行它时,它可以正常工作。
但是,我想将它发布为.exe文件,以便我可以通过双击运行它。
所以,我运行了发布,看起来成功了,但当我尝试运行已发布的.exe文件时,它会因以下异常而失败:
System.IO.FileNotFoundException: Could not load file or assembly 
'System.Private.ServiceModel, Version=4.1.2.1, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file specified.

这个错误发生在我运行发布程序的机器上,如果我试图将已发布的文件夹复制到另一台机器上,也会出现这个错误。我相信System.Private.ServiceModelMicrosoft.Windows.Compatibility包的某种深层依赖,但为什么它不起作用呢?难道它不应该自动复制到输出文件夹吗?
是否需要额外的配置或设置来使发布自动引入依赖项?
如果有影响的话,csproj文件中的引用看起来像这样:
  <ItemGroup>
    <PackageReference Include="Microsoft.Windows.Compatibility" Version="2.0.1" />
  </ItemGroup>
4个回答

2
我遇到了同样的问题,我通过安装System.Private.ServiceModel包来手动添加缺失的文件,从nuget上下载。 nuget.org的链接 不过这只是一种hack方法,因为根据该软件包的描述,它是用于.Net内部使用的,但我没有找到其他的选择。

没错,这个方法可以运行 - 但是我担心其他程序集可能被忽略了,这可能会导致应用程序在运行时出现错误。我已经向这里的dotnet团队提出了这个问题:https://github.com/dotnet/cli/issues/10381 - gallivantor
这个不起作用。当我运行它时,我遇到了与 Newtonsoft.Json 依赖项相同的问题。即使在将 nuget 依赖项显式添加到主项目并查看依赖项 dll 实际存在时,dotnet publish 也无法生成适当的输出以运行。请参见 https://dev59.com/Eek5XIcBkEYKwwoY2NLV。 - diegosasw

1

从相关的GitHub问题*来看,人们对建议的解决方法有不同的效果。

对我有效的是在构建后通过将DLL从运行时文件夹复制到bin文件夹中,通过将此添加到我的Azure Function应用程序csproj文件中实现:

<!-- https://github.com/dotnet/wcf/issues/2824 -->
<Target Name="FixForDotnetWcfIssueBuild" BeforeTargets="PostBuildEvent">
  <Copy SourceFiles="$(OutputPath)bin\runtimes\win\lib\netstandard2.0\System.Private.ServiceModel.dll" DestinationFolder="$(OutputPath)bin" />
</Target>
<Target Name="FixForDotnetWcfIssuePublish" AfterTargets="AfterPublish">
  <Copy SourceFiles="$(PublishDir)bin\runtimes\win\lib\netstandard2.0\System.Private.ServiceModel.dll" DestinationFolder="$(PublishDir)bin" />
</Target>

其他解决方法包括直接安装System.Private.ServiceModel包,或将System.ServiceModel的版本升级到4.5.3,但这两种方法都对我没有起作用。

*

https://github.com/dotnet/wcf/issues/2824

https://github.com/Azure/azure-functions-host/issues/4304

https://github.com/Azure/azure-functions-host/issues/3568#issuecomment-433146109

https://github.com/dotnet/wcf/issues/2349


0

在vsstudio中添加nuget包

Install-Package System.Private.ServiceModel

现在发布时将包括dll。


0
我发现这是由于我的一个包中的PrivateAssets="All"引起的:
<PackageReference Include="ULabs.VBulletinEntity" Version="0.7.17" />

背景: ULabs.VBulletinEntity 本身是指一些共享库,应该在不安装第二个包的情况下自动发货。所以我尝试了this workaround,它建议使用PrivateAssets="All"来集成共享库。
这个方法确实有效,但是在部署到Linux时,在dotnet restore之后,该软件包不存在。这导致启动应用程序后出现FileNotFound异常。由于我没有收到任何错误信息,因此我尝试手动安装它。
RUN dotnet add package ULabs.VBulletinEntity --version -s my-baget-repo

这至少给了我一个错误:

error: Package 'ULabs.VBulletinEntity' is incompatible with 'all' frameworks in project '/app/MyApp/MyApp.csproj'.

错误消息没有提供任何有用的信息。通常他们使用了另一个版本(例如,在3.0项目中使用了.NET Core 2.0库)。在另一种情况下,它似乎是某种奇怪的错误。
在去除了PrivateAssets="All"之后,包出现在发布输出中,我可以重新启动应用程序。这对我来说看起来很奇怪,但也许这同样适用于其他人。我花费了几个小时来解决这个问题。使用了.NET Core 2.1和.NET Standard 2.0作为库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接