获取AssemblyVersion

时间:2017-05-14 11:42:07

标签: c#

所以我试图为我的应用程序from this thread实现自动更新程序。

我已将我的设置文件上传到我的服务器,当我试图获取文件的AssemblyVersion时,我得到System.BadImageFormatException,更确切地说:

System.BadImageFormatException occurred
  HResult=0x8007000B
  Message=Det går inte att läsa in filen eller sammansättningen Setup1.msi eller ett av dess beroenden. Ett försök att läsa in ett program med ogiltigt format gjordes.
  Source=mscorlib
  StackTrace:
   at System.Reflection.AssemblyName.nGetFileInformation(String s)
   at System.Reflection.AssemblyName.GetAssemblyName(String assemblyFile)
   at WindowsFormsApp1.Form1..ctor() in C:\Users\Gustav\Documents\Visual Studio 2017\Projects\WindowsFormsApp1\WindowsFormsApp1\Form1.cs:line 50
   at WindowsFormsApp1.Program.Main() in C:\Users\Gustav\Documents\Visual Studio 2017\Projects\WindowsFormsApp1\WindowsFormsApp1\Program.cs:line 22

Inner Exception 1:
BadImageFormatException: Det går inte att läsa in filen eller sammansättningen Setup1.msi eller ett av dess beroenden. Ett försök att läsa in ett program med ogiltigt format gjordes.

我读过这是因为x64应用程序试图运行x86 DLL,但这不应该是这种情况,因为它是完全相同的应用程序我试图从中获取信息?

    string remoteUri = "http://<URL>/downloads/";
    string fileName = "Setup1.msi", myStringWebResource = null;
    // Create a new WebClient instance.
    WebClient myWebClient = new WebClient();
    // Concatenate the domain with the Web resource filename.
    myStringWebResource = remoteUri + fileName;
        myWebClient.DownloadFile(myStringWebResource, fileName);

        if (AssemblyName.GetAssemblyName("Setup1.msi").Version > Assembly.GetExecutingAssembly().GetName().Version)
        {
            logger.Add("Update found!");
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.FileName = "Setup1.msi";
            Process.Start(startInfo);
            this.Close();
        }

我的设置是x86,应用程序也是x86。

1 个答案:

答案 0 :(得分:1)

抓住我的旧答案,似乎没有简单的方法来设置MSI包的文件版本。然后,解决方案是更多的工作并且需要外部依赖性,实际上是查询MSI文件属性表。

要使此代码正常工作(确实如此,我已根据正确的MSI文件对其进行了检查),您需要WiX Toolset SDK中的程序集Microsoft.Deployment.WindowsInstaller.dllMicrosoft.Deployment.WindowsInstaller.Linq.dll }。如果安装整个工具集,则可以在压缩版本的their releases或安装文件夹中找到这些文件。

using(var database = new QDatabase("node-v6.10.3-x64.msi", DatabaseOpenMode.ReadOnly)) {
    var productVersion = database.Properties.AsEnumerable().FirstOrDefault(p => p.Property == "ProductVersion");

    if(productVersion != null)
        Console.WriteLine($"Product version is {productVersion.Value}");
}