C# 如何获取当前文化的位置';卫星装配?

C# 如何获取当前文化的位置';卫星装配?,c#,winforms,satellite-assembly,C#,Winforms,Satellite Assembly,我的C#/WF应用程序使用一些文件,这些文件对于不同的语言是不同的。这些文件不能作为资源放置在附属程序集中。但是,我希望将它们放在与附属程序集驻留的目录相同的目录中,但我需要知道程序集实际驻留的位置(包括使用二进制文件中嵌入的默认语言时的情况) 例如,当应用程序自动切换到波兰语时,我希望检索位置: D:\\pl\ 有没有办法做到这一点?请注意,我希望从程序集中检索此信息,而不是猜测文件夹位置 在Steve B的帮助下,这里有一个解决方案: string FindSatelliteAssembl

我的C#/WF应用程序使用一些文件,这些文件对于不同的语言是不同的。这些文件不能作为资源放置在附属程序集中。但是,我希望将它们放在与附属程序集驻留的目录相同的目录中,但我需要知道程序集实际驻留的位置(包括使用二进制文件中嵌入的默认语言时的情况)

例如,当应用程序自动切换到波兰语时,我希望检索位置:

D:\\pl\

有没有办法做到这一点?请注意,我希望从程序集中检索此信息,而不是猜测文件夹位置


在Steve B的帮助下,这里有一个解决方案:

string FindSatelliteAssemblyLocation(CultureInfo culture)
{
    if (culture == CultureInfo.InvariantCulture)
        return Path.GetDirectoryName(Application.ExecutablePath);

    try
    {
        Uri location = new Uri(Assembly.GetExecutingAssembly().GetSatelliteAssembly(culture).CodeBase);
        return Path.GetDirectoryName(location.LocalPath);
    }
    catch
    {
        return FindSatelliteAssemblyLocation(culture.Parent);
    }
}

您可以使用当前线程UI区域性来获取语言:

var subfolder = System.Threading.Thread.CurrentUICulture.Name;

我觉得您可以结合使用
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.getExecutionGassembly().GetName().CodeBase)
CultureInfo.CurrentUICulture
来解决这个问题

例如,如果您的程序集位于C:\Program Files\MyCompany\App\中,并且当前的UI区域性为en\u US,则可以将两者结合使用:

string exeDir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
string culture = CultureInfo.CurrentUICulture.Name;

string langDir = System.IO.Path.Combine(exeDir, culture);

要生成“C:\Program Files\MyCompany\App\en\u US”

您和我似乎有相似的方法,但您使用的是CurrentUICulture,而我只是建议使用CurrentCulture。你知道每一个的具体区别是什么吗。它声明
CurrentCulture
是线程区域性(不确定它的含义),其中
currentuicure
是查找本地化资源时使用的区域性。这就是op所问的。实际上我正在读这篇文章。它们都来自当前线程(如中所示,每个线程都有自己的CurrentCulture和CurrentUICulture),但是,这就是为什么我不确定它们之间的区别。我知道CurrentCulture基于机器本身上的本地化设置,但我不认为这与UI的本地化(也是用户决定的)有什么不同。我找到了明确的答案:我会更新我的答案。是的,但当(例如)本地化程序集位于文件夹pl中且线程的区域设置为pl-pl时,它很容易受到攻击。尝试加载线程区域设置的附属程序集将失败。我将使用
Path.Combine
而不是string.join。它的用法更明确。唉。。。请注意,我希望从程序集中检索此信息,而不是猜测文件夹位置。Spook,我不明白你在说什么?这不是“猜测”任何东西。它从当前程序集获取所有信息。另外,Steve,我会更新我的答案。我所说的猜测是指结合应用程序路径和区域性名称。AFAIR附属程序集的位置可能会更改,因此此方法将毫无用处。假设我提供的代码获取您正在运行的任何程序集的文件夹位置,然后附加区域性,这怎么会是错误的?我真的无法理解这里的问题,因为这完全符合您“我希望检索位置:…”所指的内容。根据我对附属程序集的了解,它们没有任何可执行代码,只有资源,因此您必须在某个时候运行主可执行文件。为什么卫星位置会改变?