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

时间:2018-11-22 00:38:29

标签: c# .net-core publish

我有一个目标为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 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,并且通过安装System.Private.ServiceModel软件包从nuget中手动添加了丢失的文件。

Link on nuget.org

这是一个黑客,因为从软件包的描述中您可以看到它是为.Net内部使用而设计的,但是我没有找到其他选择。

答案 1 :(得分:0)

添加vsstudio nuget包 Install-Package System.Private.ServiceModel

现在,当您发布dll时将包括在内。

答案 2 :(得分:0)

看看相关的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

答案 3 :(得分: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"之后,该包出现在publish输出中,我可以再次启动该应用程序。对我来说似乎很奇怪,但也许是同一个人的时间。我在这个问题上浪费了几个小时。为库使用了.NET Core 2.1和.NET Standard 2.0。