调用方法时,方法的参数似乎失去了范围

问题描述 投票:0回答:1

这对我来说是一个令人困惑的问题。我将 Guid 传递到另一个 DLL 中的方法中,而 Guid 作为参数,似乎失去了范围 - Guid 在前两个连字符之前保留随机值,但后面的任何内容都奇怪地归零。该 DLL 代表的代码也作为 Windows 服务运行,但我停止了 Windows 服务并且仍然注意到相同的行为)。

方法调用之前的Guid(这是正确的Guid):e808b3fa-ab7c-48fc-8224-535e41393532

方法调用后的Guid:b287a7d0-00d5-0000-0000-000000000000(我已经运行调试器几次,Guid总是改变,但似乎总是在第二个连字符之后被清零)

我想我已经解释了这个问题,但为了让代码让事情变得更清楚,这里有一个最小的代码示例:

// Service.Business.Service.cs
public static class Service
{
    internal static readonly CalendarService.ClientProxy.Calendar TradingCalendar;

    static Service()
    {
        TradingCalendar = CalendarService.ClientProxy.Service.Calendars.GetCalendarByUidOrThrow(ServiceSettings.Instance.TradingCalendarUid); // value of ServiceSettings.Instance.TradingCalendarUid is e808b3fa-ab7c-48fc-8224-535e41393532 when debugger paused on this line
    }
    public static void Initialize()
    {
    }
}
// Service.Business.ServiceSettings.cs
public class ServiceSettings : SettingsBase
{
    private static readonly ServiceSettings _Instance = new ServiceSettings();
    public static ServiceSettings Instance { get { return _Instance; } }
    public Guid TradingCalendarUid { get; private set; }
}
// Calendar.CalendarService.ClientProxy.Calendars.cs
public class Calendars : ClientWrapperCacheBase<CalendarDto, Calendar, Guid>, IEnumerable<Calendar>, IEnumerable
{
    public Calendar GetCalendarByUidOrThrow(Guid calendarUid)
    {
        Calendar calendarByUid = GetCalendarByUid(calendarUid); // value of calendarUid is b287a7d0-00d5-0000-0000-000000000000 when debugger paused on this line
    }
}

我用来调试这个问题的功能测试:

[TestMethod]
public void ServiceConstructor()
{
    Service.Business.Service.Initialize();
}

应该指出的是,其他人开发了这个代码库,而我对此有些陌生。我不认为这个问题是在我的代码更改之前发生的(因为这是一个生产代码库),其中我正在跨所有 Windows 服务从本地 ServiceBus 升级到 Azure 云托管 ServiceBus。

编辑(回答“TradingCalendarUid 在哪里设置?”):

(TradingCalendarUid 对应于 (MS) SQL Server 表中的一行中的一列...我认为此信息很简单,但在此处提供此代码以防它能阐明问题。)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;

// namespace name omitted

public abstract class SettingsBase
{
    private readonly bool ThrowOnMissingSettings;

    public SettingsBase(bool throwOnMissingSettings = false)
    {
        ThrowOnMissingSettings = throwOnMissingSettings;
    }

    protected abstract List<SettingData> OnLoad();

    protected void Load()
    {
        Type type = GetType();
        List<SettingData> list = OnLoad();
        if (list == null)
        {
            list = new List<SettingData>();
        }
        if (ThrowOnMissingSettings)
        {
            List<string> list2 = (from property in type.GetProperties()
                join setting in list on property.Name equals setting.Name into setting_join
                from _setting in setting_join.DefaultIfEmpty()
                where _setting == null
                select property.Name).ToList();
            if (list2.Count > 0)
            {
                throw new Exception("Missing configuration: " + string.Join(", ", list2));
            }
        }
        foreach (SettingData item in list)
        {
            PropertyInfo property2 = type.GetProperty(item.Name);
            if (property2 == null)
            {
                throw new Exception($"Invalid Setting. Name: {item.Name}");
            }
            TypeConverter converter = TypeDescriptor.GetConverter(property2.PropertyType);
            if (converter == null)
            {
                throw new Exception($"Converter not found. Type: {property2.PropertyType}");
            }
            property2.SetValue(this, converter.ConvertFromInvariantString(item.Value), null);
        }
    }
}
c# .net guid .net-4.7.2 service-model
1个回答
0
投票

几天前我与一位同事进行屏幕共享,问题很简单,我使用了两个版本的 DLL。我的主服务中使用了一个版本,而旧版本的 DLL 正在已运行的 Windows 服务中使用,并且我的主要服务正在连接到该服务。这就是为什么当我从其他 Windows 服务进入该方法时,该参数似乎失去了范围(也许它实际上确实失去了范围)。一旦我确保 Windows 服务具有对更新的 DLL 的正确引用,此处提到的所有内容都会按预期工作。

顺便说一句,我后来重现了错误(更简单),甚至没有使用基于类的字段,只是硬编码了一个新的 Guid,如下所示:

TradingCalendar = CalendarService.ClientProxy.Service.Calendars.GetCalendarByUidOrThrow(new Guid("e808b3fa-ab7c-48fc-8224-535e41393532"));

© www.soinside.com 2019 - 2024. All rights reserved.