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

时间:2017-12-20 12:58:15

标签: c# guid appdomain

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

我在同一个控制台应用程序中启动了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 个答案:

答案 0 :(得分:3)

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

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

  

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

您依赖此功能可以创建多个线程神奇地选择完全相同的GUID值的外观。