繁体   English   中英

如何使用c#代码从64位机器上的64位应用程序获取32位应用程序数据文件夹

[英]how to get 32 bit application data folder from 64 bit application on 64 bit Machine using c# code

我面临一个非常奇怪的问题:

我在64位Windows Server 2008 R2机器上获得了一个64位c#.net应用程序,它由Windows服务调用,它在本地系统用户下启动,而且,这个64位c#.net应用程序启动32位Java应用程序和这个java应用程序有应用程序数据文件夹到C:\\ Windows \\ SysWOW64 \\ config \\ systemprofile \\ AppData。 64位c#.net应用程序的应用程序数据文件夹到C:\\ Windows \\ System32 \\ config \\ systemprofile \\ AppData

因此对于32位应用程序应用程序数据文件夹是(在本地系统用户的情况下): - C:\\ Windows \\ SysWOW64 \\ config \\ systemprofile \\ AppData

对于64位应用程序应用程序数据文件夹(在本地系统用户的情况下): - C:\\ Windows \\ System32 \\ config \\ systemprofile \\ AppData

请注意:这不是输入错误,他们引用相反的文件夹(这是微软为64位操作系统做出的决定),你可以阅读https://msdn.microsoft.com/en-us/library/aa384187.aspx for详细解释。

现在,我需要从64位应用程序写入几个文件到32位应用程序数据文件夹,因为这些文件将由32位Java应用程序使用。

所以,我需要知道如何使用c#.net从64位应用程序获取32位app数据文件夹。

重要说明:在本地系统用户下启动应用程序(即应用程序已由窗口服务启动)时将面临此问题,并且当用户显式启动应用程序时将不会出现任何问题,因为在这种情况下,用户应用程序数据文件夹对于64位和32位应用程序将是相同的。

首先检查您是否确实在64位操作系统上运行64位进程。 如果是这样,你自己构建路径。 否则,您只需检索系统路径并附加目标路径即可。

String path;
//detect if the current application is 64 bit and running on a 64 bit system
//NOTE: needs .NET Framework 4 to work
if (Environment.Is64BitOperatingSystem && Environment.Is64BitProcess)
{
    path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "SysWOW64");
}
else
{
    path = Environment.GetFolderPath(Environment.SpecialFolder.System);
}
//append your target path
path = Path.Combine(path, @"config\systemprofile\AppData");

请注意,使用EnvironmentIs64BitOperatingSystemEnvironment.Is64BitProcess至少需要.NET-Framework 4。

最简单的解决方案是将C#应用程序重建为32位,或者使用64位Java。

如果您不能这样做,请创建一个32位应用程序,除了查找应用程序数据路径之外什么也不做,然后从C#应用程序运行它。 32位应用程序可以用C,C#或Java编写。

您是否使用“shortcut”关键字指向appdata目录,例如%APPDATA%? 你能使用直接路径,例如@“C:\\ Users \\%username%\\ AppData \\ Local”

这与上面#2(通过Sebastian Baumhekel)的答案相同,但纠正了一些错误。 我在Win 7上遇到了同样的问题。 正如一些人所指出的,这可能不是未来的操作系统安全......但它解决了我当前的问题。

当您以本地系统用户身份运行32位Windows服务并询问此文件夹时,问题出现在64位Win7上:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

它返回64位版本(使用System32):

C:\Windows\System32\config\systemprofile\AppData\

澄清要点(如OP所述):

SysWOW64获得32位应用程序数据......

System32获取64位应用程序数据......

来自OP链接:

https://docs.microsoft.com/en-us/windows/desktop/WinProg64/file-system-redirector

我只是浪费了4个小时的生命,所以我想澄清一下!

    public 32bitWindowsServiceOn64bitWindows()
    { 
        // Note: this service is configured to run as "Local System" user...

        string appdata;

        // need to do this, because this runs as Local System user... 
        // which gets the wrong SpecialFolder.ApplicationData (ie, System32 for 64bit apps) should be SysWOW64 (for 32bit apps)

        if (Environment.Is64BitOperatingSystem && Environment.Is64BitProcess)
        {
            // the application is a 64 bit app
            appdata = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "System32");
        }
        else
        {
            // the application is a 32 bit app
            appdata = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "SysWOW64");
        }
        // Append your target path. Do you want Local or Roaming?
        appdata = Path.Combine(appdata, @"config\systemprofile\AppData\Roaming\MyApp");
        //appdata = Path.Combine(appdata, @"config\systemprofile\AppData\Local\MyApp");
        ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM