c# - 更新 Service Fabric 服务时,.Net Framework 类库 dll 总是发生变化

标签 c# azure-devops azure-service-fabric .net-standard-2.0

我有一个在 Service Fabric 中运行的无状态 .Net Core 服务。在我的服务中,我引用了一个针对 .Net Framework 4.7.1 的类库。我通过 VSTS 部署应用程序,其中一个构建步骤更新了服务的应用程序版本并进行了更改。 https://learn.microsoft.com/en-us/vsts/build-release/tasks/utility/service-fabric-versioning

除了总是检测到类库的 dll 文件的更改外,一切正常。即使我没有更改代码库中的任何内容!这会导致构建步骤影响每个服务的版本。不仅仅是真正有更新的服务。

日志如下所示。 “MyClassLibrary.dll”是一个 .Net Framework 类库,我没有接触过其中的代码。

2018-03-12T11:39:51.1989307Z     Searching service 'MyServicePkg' for 
changes...
2018-03-12T11:39:51.2247570Z         Searching package 'Code' for changes...
2018-03-12T11:39:51.9878149Z             The file 'MyClassLibrary.dll' has 
changed.
2018-03-12T11:39:54.3850926Z           Updated package 'MyServicePkg\Code' 
from version '1.0.0' to '1.0.1'.

我知道检查代码包中的更改是二进制比较。所以编译项目时二进制文件明显改变了。但是,我不知道为什么。我还有针对 .Net Standard 2.0 的代码库,它们不会导致此问题,因为只有在我实际接触代码时才会检测到更改。

我还知道可以手动忽略不应从应用程序包中更新的文件 https://stackoverflow.com/a/34886586但是,这不是一个选项,因为部署链是自动化的。

所以我有以下问题:

  1. 是什么导致 .Net Framework 类库的二进制文件发生变化?
  2. 它与 .Net Standard 类库有何不同?
  3. 我该如何解决这个问题,以便我的服务仅在我进行实际更改时更新?从 .Net Framework 移植到 .Net Standard?

非常感谢对此事的一些见解。

最佳答案

默认情况下,即使您未进行任何更改,编译器也会创建不同的输出。使用确定性编译器标志确保具有相同输入的构建产生相同的输出。

因此,您需要在 MSBuild Arguments 中指定 /p:Deterministic=true 参数。

最简单的方法是使用Azure Service Fabric Application构建模板:新建一个构建定义>选择Azure Service Fabric Application模板,然后你会发现,有/p:Deterministic=true/p:PathMap=$(Agent.BuildDirectory)=C:\ 在 Visual Studio Build 任务的 MSBuild Arguments 中。

关于c# - 更新 Service Fabric 服务时,.Net Framework 类库 dll 总是发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49236009/

相关文章:

c# - 如何在 RichTextBox 中显示带有公式的 RTF 文档?

Azure Devops (VSTS) 代理池和部署池之间的差异

c# - XNA 新手,一般问题

c# - 如何将 TreeView 复选框设置为部分选中?

azure-devops - Azure 管道模板 - 参数上的 toLower

git - 我可以运行位于 Azure 数据工厂上的 git 存储库中的 SQL 脚本文件吗?

api - 运行集成测试的最佳实践是什么?

ssl - 自签名客户端证书未到达服务器应用程序

azure-resource-manager - 部署中的 key 保管库值和链接的模板参数

c# - 如何转换以下 ino lambda 表达式(方法语法)?