【问题标题】:Why am I getting "Win32Exception" with this code?为什么我收到此代码的“Win32Exception”?
【发布时间】:2014-03-07 21:57:49
【问题描述】:

根据我对thisthis 的了解,我的应用程序从一个可以用@"\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


【解决方案1】:

为什么不从一个简单的应用开始,你只需要在设备上运行一个基本的应用程序?这将告诉您这是否是路径问题。没有实时调试器并不意味着您应该放弃“从简单开始”的调试基础。

public static void Main()
{
    var path = "\\my\\file\\path.foo";

    Console.WriteLine("Checking for file...");
    var fi = new FileInfo(path);
    if(!fi.Exists)
    {
        Console.WriteLine("File doesn't exist");
        return;
    }

    try
    {
        Console.WriteLine("Getting version...");
        const int VERSION_DEPTH = 4;
        var version = NativeFile.GetFileInfo(path);
        Console.WriteLine(version.Version.ToString());
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error: " + return ex.Message);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多