为什么我用这段代码得到“Win32Exception”?

时间:2014-03-07 21:57:50

标签: c# compact-framework windows-ce versioning

根据我对thisthis的理解,我的应用程序运行的位置可以使用@“ \ Program Files \ HHS \ HHS.exe “:

enter image description here

...我想访问的文件可以通过@“\ Application \ sscs \ HHSetup.exe”访问:

enter image description here

...但是这段代码:

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");

1 个答案:

答案 0 :(得分:1)

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

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);
    }
}