0

我正在查看的实际问题可能比标题所暗示的要复杂一些,但我还没有理解它。这是我所拥有的:

语境

我有一个包含许多项目的解决方案,但这里只有 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 的加载存在问题时,问题就消失了。
4

0 回答 0