Одна и та же машина, разные домены приложений, одинаковые GUID
Я совершенно уверен, что я делаю что-то не так или понимаю что-то не так. Трудно дать фрагмент кода, чтобы показать мою проблему, поэтому я попытаюсь объяснить мой сценарий, с результатом.
Я запускаю несколько экземпляров DLL в одном консольном приложении, но в своем собственном домене приложений. Затем я сгенерировал Guid.NewGuid(), который я назначил классу в экземпляре, и установил папку приложения в новую папку. Это прекрасно работает до сих пор. Я вижу, что все прекрасно работает, и мои экземпляры разделены. Однако... когда я начал менять папку моего приложения на то же имя, что и уникальный GUID, сгенерированный для этого класса, я начал собирать аномалии.
Это прекрасно работает, когда я медленно создаю новые экземпляры, но когда я вбиваю новые, приложение начинает собирать данные в своей папке, когда запускается. После некоторого расследования я обнаружил, что это потому, что эта папка уже существует, поскольку этот GUID уже создан. При дальнейшем исследовании я вижу, что машина делает небольшую паузу, а затем продолжает генерировать новые экземпляры, все с тем же GUID.
Я понимаю, что алгоритм генерации GUID использует MAC как часть его, но у меня сложилось впечатление, что даже если одна и та же машина в один и тот же точный момент генерирует два GUID, он все равно будет уникальным.
Я прав в этом утверждении? Где я не прав?
Код:
Guid guid = Guid.NewGuid();
string myFolder = Path.Combine(baseFolder, guid.ToString());
AppDomain ad = AppDomain.CurrentDomain;
Console.WriteLine($"{ad.Id} - {guid.ToString()}");
string newHiveDll = Path.Combine(myFolder, "HiveDriveLibrary.dll");
if (!Directory.Exists(myFolder))
{
Directory.CreateDirectory(myFolder);
}
if (!File.Exists(newHiveDll))
{
File.Copy(hiveDll, newHiveDll);
}
Directory.SetCurrentDirectory(myFolder);
var client = ServiceHelper.CreateServiceClient(serviceURL);
ElementConfig config = new ElementConfig();
ElementConfig fromFile = ElementConfigManager.GetElementConfig();
if (fromFile == null)
{
config.ElementGUID = guid;
config.LocalServiceURL = serviceURL;
config.RegisterURL = registerServiceURL;
}
else
{
config = fromFile;
}
1 ответ
Directory.SetCurrentDirectory
тонкая оболочка поверх функции Kernel 32 SetCurrentDirectory
,
К сожалению, авторы документации.NET не решили скопировать предупреждение из нативной функции:
Многопоточные приложения и код общей библиотеки не должны использовать функцию SetCurrentDirectory и должны избегать использования относительных имен путей. Текущее состояние каталога, записанное функцией SetCurrentDirectory, сохраняется как глобальная переменная в каждом процессе, поэтому многопоточные приложения не могут надежно использовать это значение без возможного повреждения данных из других потоков, которые также могут считывать или устанавливать это значение
Именно ваша зависимость от этой функции создает впечатление, что несколько потоков волшебным образом выбрали одно и то же значение GUID.