C#无法从Windows Server 2012 64位

时间:2016-01-18 15:43:23

标签: c# .net registry windows-server-2012-r2

我正在将三个Windows服务(.NET 3.5)从Windows Server 2003R2迁移到Windows Server 2012 R2(.NET 4.5)。

前两个进展顺利。从中读取注册表设置 的 [HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ MyCompany的\所有MyApplication]

现在这里有趣的东西 - 第三个只在我存储设置时才有效 [HKEY_LOCAL_MACHINE \ SOFTWARE \ MyCompany \ MyApplication] (whitout Wow6432Node)?

并且,如果我尝试使用32位注册表中的设置运行该服务,它会读取设置,但我得到此程序集绑定错误: System.BadImageFormatException:无法加载文件或程序集'Oracle.DataAccess,Version = 4.121.2.0,Culture = neutral,PublicKeyToken = 89b483f429c47342'或其依赖项之一。尝试加载格式不正确的程序。其他两个使用相同的dll,工作正常。

有什么想法吗?第三个Windows服务有何不同?

由于所有应用程序使用相同的代码来读取注册表,我不认为这是问题所在。无论如何,她的代码(简称)。

    private string getRegistrySetting(string keyName)
    {
        string softwareSubkeyName = "SOFTWARE";
        using (RegistryKey softwareSubkey = Registry.LocalMachine.OpenSubKey(softwareSubkeyName, false))
        {
            string lmSubkeyName = "MyCompany\\MyApplication;
            using (RegistryKey lmSubkey = softwareSubkey.OpenSubKey(lmSubkeyName))
            {
                return lmSubkey.GetValue(keyName).ToString();
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

首先,您需要确保所有可执行文件的目标平台都在项目的属性页面的构建选项卡上设置为x86(而不是AnyCPU)(警告:这是一个构建 - 配置设置,您需要为Debug和Release版本设置目标平台)。

然后,您需要确保还部署了32位版本的任何第三方组件,例如Oracle.DataAccess。原因是32位进程无法加载64位dll,反之亦然。

目标平台是相关的,因为它确定您的进程是作为32位还是64位进程启动。如果您的可执行文件作为64位进程运行,则注册表和文件系统重定向不会到位 - 因此,您的进程将直接读取和写入HKEY_LOCAL_MACHINE\SOFTWARE\而不是Wow6432Node子节点