c# - 在 .Net 4 框架中编译的应用程序将无法在 Server 2012 上运行

标签 c# .net visual-studio-2012

我将我的应用程序编译为使用 .NET Framework 4,因为我需要它在不支持 .NET Framework 4.5 的 XP 和 Server 2003 上运行。问题是它现在在 XP 和 2003 服务器上运行良好,但在我的服务器 2012 上运行不正常。服务器 2012 具有 .NET 4.5,据我所知,.NET 4.5 向后兼容 .Net 4

在它下面是我在 2012 服务器上收到的错误:


如果您单击“继续”,您的应用程序中发生了未处理的异常,应用程序将忽略此错误并尝试继续。如果单击退出,应用程序将立即关闭。

系统找不到指定的文件。

详细信息:

See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.ComponentModel.Win32Exception (0x80004005): The system cannot find the file specified
   at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
   at MyApplication.Form1.DirectoryExporter_Click(Object sender, EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18449 built by: FX451RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll
----------------------------------------
MyApplication
    Assembly Version: 1.0.0.0
    Win32 Version: 1.0.0.0
    CodeBase: file:///C:/Users/administrator.DM/Desktop/MyApplication.exe
----------------------------------------
System.Windows.Forms
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------

************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.

这是此时调用的代码:

public string get_regValue(string userroot, string subkey, string keyname, string app)
        {
            string userRoot = userroot;
            string subKey = subkey;
            string keyName = userRoot + "\\" + subKey;

            string regValue = (string)Registry.GetValue(keyName, keyname, null);
            regValue = regValue + app;

            return regValue;
        }

        private void DirectoryExporter_Click(object sender, EventArgs e)
        {
            // Button to Launch the Directory Exporter
            string regKey;
            RegistryKey openKey = Registry.LocalMachine.OpenSubKey("HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Dell");
            // Checks for key, if null (empty) get 32 bit key
            if (openKey == null)
            {
                // 32 bit key
                regKey = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Dell";
            }
            else
            {
                // 64 bit key
                regKey = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Dell";
            }

            var regvalue = get_regValue(regKey, "Migrator for GroupWise", "AdminInstallDir", "gwdirapp.exe");
            Process.Start(@regvalue);
        }

最佳答案

我强烈怀疑这与您使用的 .NET 版本无关。毕竟,从堆栈跟踪中您可以清楚地看到您的代码正在执行:

at MyApplication.Form1.DirectoryExporter_Click(Object sender, EventArgs e)

我怀疑问题出在权限问题上 - 无论您尝试在 Windows Server 2012 下做什么都会失败,因为它在更锁定的环境中运行。

或者,您可能正在尝试启动一个存在于您的开发机器上但不在服务器上的进程。如果不查看代码,我们无法真正判断 - 但您基本上应该仔细查看您在 DirectoryExporter_Click 中所做的事情,尤其是当您调用 Process.Start 时。检查您要运行的可执行文件,然后检查它是否存在于服务器上,以及您运行的用户是否有权执行它。

关于c# - 在 .Net 4 框架中编译的应用程序将无法在 Server 2012 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25687087/

相关文章:

.net - 持久打印机设置

intellisense - 如何在 Visual Studio 2012 中设置英语的 UI 语言和另一种语言的 IntelliSense 提示语言?

c# - 将命名空间添加到自定义 XML 文件

c# - C# 中具有父引用的文件和文件夹结构的复合模式

c# - 使用 Helix-Toolkit 在 C# 中显示 .ply 点云

c# - 准备一个实时应用程序来保存不可预见事件的状态数据,例如意外关闭、崩溃等

c# - 如何使用 lambda 将列表对象添加到类中?

visual-studio-2012 - MyDocuments/IIsexpress 文件夹被删除

Azure:我可以将不在解决方案目录中的文件复制到输出目录吗?

c# - Visual Studio Code 中的代码格式不适用于 C# 代码