相同的机器,不同的应用程序域,相同的GUID即将出现

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

我很确定我做错了什么,或者理解错误。很难给出一段代码来展示我的问题,所以我将尝试用结果来解释我的场景。

我在同一个控制台应用程序中启动了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;
}
c# guid appdomain
1个回答
3
投票

Directory.SetCurrentDirectory是内核32函数SetCurrentDirectory上的一个薄包装器。

不幸的是,.NET documentation writers没有选择复制来自native function的警告:

多线程应用程序和共享库代码不应使用SetCurrentDirectory函数,应避免使用相对路径名。由SetCurrentDirectory函数写入的当前目录状态在每个进程中存储为全局变量,因此多线程应用程序无法可靠地使用此值,而不会从可能正在读取或设置此值的其他线程中损坏数据

这是你对这个功能的依赖,它创造了多个线程神奇地选择了完全相同的GUID值的外观。

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