所以我试图为我的应用程序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。
答案 0 :(得分:1)
抓住我的旧答案,似乎没有简单的方法来设置MSI包的文件版本。然后,解决方案是更多的工作并且需要外部依赖性,实际上是查询MSI文件属性表。
要使此代码正常工作(确实如此,我已根据正确的MSI文件对其进行了检查),您需要WiX Toolset SDK中的程序集Microsoft.Deployment.WindowsInstaller.dll
和Microsoft.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}");
}