【发布时间】:2014-03-07 21:57:49
【问题描述】:
根据我对this 和this 的了解,我的应用程序从一个可以用@"\Program Files\HHS\HHS.exe" 引用的位置运行:
...我想访问的文件可以通过@"\Application\sscs\HHSetup.exe":
...但是这段代码:
string clientVer = HHSUtils.GetFileVersion(@"\Application\sscs\HHSetup.exe");
. . .
public static string GetFileVersion(string filePath)
{
try
{
const int VERSION_DEPTH = 4;
var version = NativeFile.GetFileInfo(filePath);
return version.Version.ToString(VERSION_DEPTH);
}
catch (Exception ex)
{
return ex.Message;
}
}
...失败。 GetFileVersion() 返回“Win32Exception”,而不是“3.1.4.7”之类的版本号(或“0.0.0.0”之类的“找不到”值)。 /p>
即使我通过强制这样一个“哦,好吧”的值来处理这个问题:
if (clientVer.Contains("Exception"))
{
clientVer = "0.0.0.0";
}
...后续调用失败并显示“无法连接到远程服务器”
// both serial num and clientVer have valid values now, such as "8675309" for serialNum and "0.0.0.0" for clientVer
string uri = string.Format("http://localhost:28642/api/FileTransfer/GetUpdatedHHSetup?serialNum={0}&clientVersion={1}", serNum, clientVer);
RESTfulMethods.DownloadNewerVersionOfHHSetup(uri);
...但那是另一回事了;我的问题是:为什么 GetFileVersion() 返回“Win32Exception”?我发送的路径 (@"\Application\sscs\HHSetup.exe") 是错误的,还是 GetFileVersion() 本身有问题?
更新
由于代码几乎可以保证是好的,我认为问题一定出在我传入的路径中——它的格式之类的。也许它 是 一个权限错误,正如 Michael Kniffen 在下面所假设的那样;但如果是这样,我不知道如何解决它。或者可能是路径格式问题?我不知道;我比 19 世纪俄勒冈州的宅基地更难过……
更新 2
这似乎是一个路径问题;捷克这个:
//string clientVer = HHSUtils.GetFileVersion(@"\Application\sscs\HHSetup.exe");
// to see if the path is the problem, try something more straightforward:
string clientVer = HHSUtils.GetFileVersion(@"\Program Files\HHS\vsd_setup.dll");
注释掉的代码导致了问题。
新代码运行正常;我得到了一个有效的文件版本(“1.0.2268.0”)。
所以它几乎必须是路径(“\Application”对于访问“内部闪存驱动器”(或任何正确的术语)不正确)或者文件本身 - 它没有文件版本信息,因此这种情况可能是问题的原因。
我将通过复制 sscs 文件夹下的 vsd_setup.dll 来测试这一点并尝试:
更新 3
这是文件 - 测试工作正常。因此,如果文件没有版本信息,则会返回 Win32Exception 13。
如果正在查找的文件有版本信息,我会得到它(例如“1.0.2268.0”);但是,如果没有,请注意下方 - 所有达拉斯都崩溃了!
string clientVer = HHSUtils.GetFileVersion(@"\Application\sscs\vsd_setup.dll");
【问题讨论】:
-
这很可能是权限错误。尝试将文件的文件权限设置为“所有人”的“完全访问”,看看它是否能解决您的问题
-
养成不使用try/catch的习惯,直到你明白它的作用。
-
这绝对不是权限问题。 Win CE 没有权限。如果您的代码正在运行,则它具有权限。
-
@B.ClayShannon 让您的调试器正常工作。以下是我通过以太网执行此操作的方法(如果有的话):stackoverflow.com/questions/12968547/… 我不确定您使用的是什么类型的设备,但您有点受制于 OEM 是否包含必要的组件用于调试的 windows 图像。试试那个链接,它很容易。您复制几个文件,执行它们,然后通过以太网与 IP 连接
-
@B.ClayShannon 在真实设备上通过 activesync 进行调试。你不需要模拟器,选择'windows ce device'
标签: c# compact-framework windows-ce versioning