我正在查看的实际问题可能比标题所暗示的要复杂一些,但我还没有理解它。这是我所拥有的:
语境
我有一个包含许多项目的解决方案,但这里只有 3 个问题:一个 ASP.NET WebForms UI 项目(项目 A)和一个 Web 服务项目(项目 B)。
+ Solution
└ Project A (Web GUI)
| └ log4net (v1.2.13))
| └ Library C (Common library)
| └ log4net (v1.2.13))
└ Project B (Web Services, contains Swagger)
└ log4net (v1.2.13))
└ Library C (Common library)
└ log4net (v1.2.13))
项目 A 引用了项目 B,因为它使用了我不想实现两次的 Web 服务的某些部分。两者还引用程序集 C(相同版本),这是一个不属于解决方案代码的库。所有这些都引用了相同的 log4net 库版本。
由于项目 B 还具有 Swagger,因此它包含以下SwaggerConfig.cs
文件:
[assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")]
namespace Web.Services.External {
public class SwaggerConfig {
public static void Register() {
// LINE OF TROUBLE
string rootUrl = ConfigurationManager.AppSettings.TryGetStringValue("SwaggerRootUrl");
if (!string.IsNullOrWhiteSpace(rootUrl)) {
GlobalConfiguration.Configuration
.EnableSwagger(c => {
//.......
现在这一切都适用于 swagger 和 Web 服务,但是一旦启用“LINE OF TROUBLE”,项目 A(!)中的 Log4Net 就会默默地失败。
此行使用自定义AppSettings.TryGetStringValue
方法,该方法驻留在引用的、自行编写的 .NET 程序集“C”中,并且基本上执行该AppSettings.Get
方法的功能,并可能具有默认值。
一旦我使用AppSettings.TryGetStringValue
,登录项目 A 就会失败。使用内置时AppSettings.Get
,日志记录有效。
问题
我怀疑问题在于引用程序集“C”的加载,但究竟为什么呢?
为什么 Log4Net 在项目“A”中静默失败PreApplicationStartMethod
,而在另一个引用的项目“B”中使用时,该项目“B”引用了自定义 .NET 库“C”?
笔记
string rootUrl = ConfigurationManager.AppSettings.Get("SwaggerRootUrl");
当我将 LINE OF TROUBLE 替换为仅暗示引用库 C 的加载存在问题时,问题就消失了。