问题:.NET 代码从同一个磁盘上的一个目录运行,但不能从另一个目录运行
题
我们的应用程序是混合 Win32 非托管应用程序和 .NET 2.0 托管应用程序。Win32 部分是主要的可执行文件,它在某些时候加载和托管 .NET 2.0 运行时,并加载一些托管模块以打开新的 winforms 窗口。
我们也遇到过 CASPOL 类型的问题,但今天我们遇到了一个非常奇怪的问题,我希望有人能给我一些指示或想法,或者基本上任何真正的东西,这会引发一些有助于帮助我的东西的火花我们解决这个问题。
在通过 Citrix 访问的服务器上,如果应用程序文件位于当前登录用户(服务器/域管理员)桌面上的目录中,则程序运行正常。.NET 窗口按预期打开。
但是,如果我们将目录移动到同一磁盘的根目录,即服务器中的物理磁盘(因此没有 SAN 映射或任何会触发 CASPOL 命令的内容) 据我所知) 并保持其他一切相同,相同的用户,相同的配置等。, ,当我们尝试调用 .NET 窗口时,应用程序会悄然崩溃。它以消失的方式崩溃,这表明它可能类似于堆栈溢出。我们正在考虑向应用程序的某些部分添加日志记录,以便能够弄清楚发生了什么以及在哪里发生,但我也在这里发布了这个问题。
到目前为止,我们已经验证了 CASPOL 访问列表中没有任何异常,NGEN 缓存中没有任何异常(我在想,如果服务器所有者使用过它,可能之前的图像已损坏),并且 NGEN 缓存中没有任何异常。 GAC(我们不将 GAC 用于程序集)。
总结:
- 如果程序从 U:\Documents and Settings\USERNAME\Desktop\directory 运行,则它可以工作
- 如果从 U:\ 目录运行,则不会
- 你:是服务器中的物理磁盘
- NGEN 或 GAC 缓存中没有明显的异常情况
- 正确的 .NET 运行时已安装,我们的应用程序的正确文件也已安装(如果从桌面位置运行,确实可以正常工作)
有人有什么可以帮忙的吗?
编辑: 问题 在这里再次询问 具有不同/其他信息,并“解决”。
解决方案
我的第一个尝试是从 MS-Sysinternals 运行进程监视器,并查看这两种情况下的调用/结果有何不同。也许这会给你一些提示(同一调用的不同结果,问题运行中的一些错误不是好的错误......)
您可以从 MS 下载进程监视器:http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx
其他提示
我前段时间也遇到过这样的问题。经过一番拉扯,我发现了问题。
使用 Process.Start() 或任何此类调用时要非常小心,因为根据您启动它的方式,它可以使用各种文件夹作为工作环境(当前路径、系统环境等)。
我的第一个想法是,您需要确保程序中没有定义相对/绝对路径来引用程序集、文件等。当您移动应用程序根目录时,这会引起麻烦。
是否有可能与用户权限有关?运行它从 LUA 探照灯 去检查。即使它不直接相关,该工具也可能会提供一些有用的提示。