跨DLL传递Guid参数时出现截断异常的技术求助
Guid跨DLL传递异常:参数后半段被置零
将Guid从当前项目传递到另一个DLL的方法时,参数出现异常——前两个连字符前的部分保留随机值,但之后的内容全部被奇怪地置零。已停止该DLL对应的Windows Service,问题仍然存在。
- 方法调用前的正确Guid:
e808b3fa-ab7c-48fc-8224-535e41393532 - 方法调用后的异常Guid:
b287a7d0-00d5-0000-0000-000000000000(多次调试发现前半段值会变化,但后半段始终置零)
简化后的代码示例
Service.Business.Service.cs
public static class Service { internal static readonly CalendarService.ClientProxy.Calendar TradingCalendar; static Service() { // 调试时此处TradingCalendarUid值为e808b3fa-ab7c-48fc-8224-535e41393532 TradingCalendar = CalendarService.ClientProxy.Service.Calendars.GetCalendarByUidOrThrow(ServiceSettings.Instance.TradingCalendarUid); } 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) { // 调试时此处calendarUid值为b287a7d0-00d5-0000-0000-000000000000 Calendar calendarByUid = GetCalendarByUid(calendarUid); } }
调试用功能测试代码
[TestMethod] public void ServiceConstructor() { Service.Business.Service.Initialize(); }
补充说明
- 代码库由他人开发,本人是新手。
- 问题是在将所有Windows Service从本地ServiceBus升级到Azure云托管ServiceBus后出现的。
- 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); } } }
内容的提问来源于stack exchange,提问作者user3773048
相关产品推荐
相关产品推荐

