我有一个用于.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并使用它,但必须提高版本号。是吗?
答案 0 :(得分:1)
如果二进制比较中的程序集是相同的,并且一个加载但另一个不加载,则可能是安全问题。
.Net跟踪程序集的来源,并对源自Internet的程序集应用不同的安全策略,例如,以防止意外运行恶意代码。
如果从不同位置复制两个相同的程序集,.Net加载程序可能会对其进行不同的处理。