本地dll和nuget lib之间的奇怪C#.Net依赖关系

时间:2018-07-06 15:53:02

标签: c# jenkins nuget

我有一个用于.Net日志组件的项目。

在其他许多项目中使用时,我过去决定将其推送到nuget.org。在其他项目中,我确实引用了此程序包。

到目前为止很好。

现在,我开始使用Jenkins设置部署服务器。

在Jenkins中,我有一个构建该日志组件并将项目log.dll复制到最终目标的项目。

当与nuget.org包中的log.dll正常工作的组件使用Jenkins构建中的本地构建log.dll时。

我在事件日志中收到此错误:

Application: ServiceConsole.exe Framework Version: v4.0.30319 Description: 
The process was terminated due to an unhandled exception. 
Exception Info: 
System.IO.FileLoadException at ServiceConsole.MainForm..ctor() 
at ServiceConsole.Program.Main() 

还有一个

ServiceConsole.exe 
   2.10.0.0 
   5b3f4a6d 
   KERNELBASE.dll 
   10.0.14393.2312 
   5b1a1651 
   e0434352 
   0000000000033c58 
   480c 
   01d4153f46b746a1 
   C:\bin\ServiceConsole.exe 
   C:\Windows\System32\KERNELBASE.dll 
   05d03123-c336-4119-947f-7de71a75c0b5 

我确实比较了这两个dll(来自nuget.org,并使用jenkins(msbuild.exe)在本地构建)。

两个dll都有:

  • 相等代码
  • 大小相等
  • 编译版本
  • 构建相同的程序集版本
  • 相同的产品版本

我唯一想到的区别是Jenkins中的msbuild.exe来自VS2017构建工具,而几个月前我确实在nuget上发布了dll是VS2015。

有人知道这可能是什么吗?真的是编译器问题吗?

编辑很好奇,并从VS2015(版本14)安装了MSBuild.exe,并更改了Jenkins设置。使用此版本的本地版本也不起作用...

所以我认为我仍然唯一的区别是,我在nuget.org上推送的前一个软件包是使用VS2015 IDE在开发机器上构建的。

修改

甚至没有触发的起始代码:

static class Program
    {
        private static readonly string _assemblyName = Assembly.GetExecutingAssembly().GetName().Name;
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
      try
      {
        Console.WriteLine("starting app");
        using (var processLock = new ProcessLock(_assemblyName))
        {
          if (processLock.AlreadyExists)
            return;

          // The program operation must run inside the 'using' block.
          Application.EnableVisualStyles();
          Application.SetCompatibleTextRenderingDefault(false);
          Application.Run(new MainForm());
        }
      }
      catch (Exception e)
      {
        Console.WriteLine(e);
        throw;
      }


    }
}

EDIT2

因此,事实证明,在最后一次推送以获取公钥令牌后更改签名密钥文件会发生更改,并导致此错误。

start appSystem.IO.FileLoadException: Could not load file or assembly 'Common.Log, Version=2.10.0.0, Culture=neutral, PublicKeyToken=8a1542bdbac62407' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Common.Log, Version=2.10.0.0, Culture=neutral, PublicKeyToken=8a1542bdbac62407'
   at ServiceConsole.MainForm..ctor()
   at ServiceConsole.Program.Main()

=== Pre-bind state information ===
LOG: DisplayName = Common.Log, Version=2.10.0.0, Culture=neutral, PublicKeyToken=8a1542bdbac62407
 (Fully-specified)
LOG: Appbase = file:///C:/prog/bin/
LOG: Initial PrivatePath = NULL
Calling assembly : ServiceConsole, Version=2.10.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Common.Log, Version=2.10.0.0, Culture=neutral, PublicKeyToken=8a1542bdbac62407
LOG: Attempting download of new URL file:///C:/prog/bin/Common.Log.DLL.
WRN: Comparing the assembly name resulted in the mismatch: PUBLIC KEY TOKEN
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

正在寻找确认。 因此,要解决的下一步是将新版本发布到nuget并使用它,但必须提高版本号。是吗?

1 个答案:

答案 0 :(得分:1)

如果二进制比较中的程序集是相同的,并且一个加载但另一个不加载,则可能是安全问题。

.Net跟踪程序集的来源,并对源自Internet的程序集应用不同的安全策略,例如,以防止意外运行恶意代码。

如果从不同位置复制两个相同的程序集,.Net加载程序可能会对其进行不同的处理。