我有一个应用程序我有一些.NET4组件更新,包括自定义动作的.dll运行时,应用程序将被卸载。 该应用最初安装与.net 3.5和安装和卸载时,它需要一些定制动作。

问题是卸载自定义动作的.dll文件现在,当已经改变了它的.Net 4版本,我得到一个 System.BadImageFormatException:无法加载文件或程序 “X”或它的一个依赖。该组件由一个内置 运行时比当前加载的运行库更新,无法加载。文件 名: 'X'

有谁知道一种方法来告诉卸载程序在.NET 4中开始的过程,而不是调用的.Net 3.5加载自定义操作的dll?哪里该卸载信息的每一个存储产品?怎么样?

有帮助吗?

解决方案 3

经过长期的研究后,我发现了一个方法来解决这个问题。我做了一个版本的应用程序上的.Net 4和生成的安装程序。安装了它,然后比较.msi文件的应用程序保存在C:与以前的版本相同的文件,但与.net 3.5(原始安装)的\的Windows \ Installer文件夹。然后打开这两个文件与逆戟鲸,并改变了一些属性值和几个来自新的.NET 4 msi文件的NET 3.5的msi文件的二进制文件。点击 现在,当我做出的在App单个文件更新到.NET 4.0版本他们(所以在.NET 4.0的应用程序运行),我还需要改变位于C卸载.msi文件:\ WINDOWS \安装程序,然后卸载Windows安装程序时将调用.NET 4中做自定义操作,而不是NET 3.5的这是在安装应用程序时的原始版本。

下面是一种可自动处理和无需使用奥卡,只是通过MSI文件变化和两个必要DLL(这是我从的净4版的MSI中提取)的脚本。

var installer=new ActiveXObject("WindowsInstaller.Installer");
var db;
var msiOpenDatabaseModeTransact = 1;
var msiFile = WScript.Arguments.Item(0);
var installbuildfile = WScript.Arguments.Item(1);
var auxDllFile = WScript.Arguments.Item(2);
database = installer.OpenDatabase(msiFile, msiOpenDatabaseModeTransact);

    var view = database.OpenView("SELECT Name,Data FROM Binary");
    view.Execute();
    var rec;
    for (rec = view.Fetch(); rec != null; rec = view.Fetch()) {
        WScript.echo("Current SmartUpdater.exe version is: "+rec.StringData(1)); 
        if (rec.StringData(1) == "InstallUtil") {
            rec.SetStream(2, installbuildfile);
            view.Modify(2, rec)
            WScript.echo("Changed: " + rec.StringData(1)); 
        }
        if (rec.StringData(1) == "MSVBDPCADLL") {
            rec.SetStream(2, auxDllFile);
            view.Modify(2, rec)
            WScript.echo("Changed: " + rec.StringData(1)); 
        }
    }
    view.Close();
    view = database.OpenView("UPDATE Property SET Value='v4.0' WHERE Property='VSDFrameworkVersion'");
    view.Execute();
    view.Close();

database.Commit();

在InstallUtil DLL文件可以在.NET目录在c发现:\ Windows为4.0版本,命名为MSVBDPCADLL第二个仍然是我的一个谜,但我可以从生成的MSI净解压4(可以有对32级64的版本的差异,可能你将需要提取不同版本的DLL)

其他提示

您好 要定位为一个可执行文件名为APP.EXE的.NET框架的特定版本,你可以把那些行:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0.30319"/>
  </startup>
</configuration>

到名为app.exe.config靠近可执行文件。如果该文件已经存在,只是合并两个个XML(编辑:我把“v4.0.30319”,因为这是我在我的电脑上的版本,但你应该把一个你,看一下%WINDIR%\微软。 NET \框架或%WINDIR%\ Microsoft.NET \ Framework64得到它)。

也许你不知道,卸载软件的可执行文件的名称。在这种情况下,您可以尝试使用Process Explorer中找到它(http://www.windowsitpro.com/article/utilities/find-the-source-of-an-error-message.aspx)。

但要注意:这样做会改变所有运行的.NET FX目标用相同的过程,因此,(也许)改变与该卸载程序做了所有卸载的行为

安装您正在使用什么版本的Windows?我不能肯定地说,但我不知道,如果你使用的是安装程序的旧版本的希望的使用3.5框架。

要检查一下,看看属性安装项目。点击“先决条件”,并滚动到对话框的底部。检查的版本,你要使用的安装过程。

老实说,我从未有过/注意到了这个问题,但我不知道如果使用的是较新的Windows安装程序会修复它。

“你好,SO!”

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top