Windowsのネット4アセンブリを実行するために.Net3.5を呼び出すインストーラ

StackOverflow https://stackoverflow.com/questions/4035363

  •  26-09-2019
  •  | 
  •  

質問

私はアプリの私を持っているが、アプリをアンインストールしようとしているときにカスタムアクションがその実行を.dllを含め、いくつかの.Net4アセンブリを更新しました。 アプリケーションが最初に.NET 3.5でインストールされ、インストールやアンインストール時には、いくつかのカスタムアクションを必要とします。

問題は今、カスタムアクションの.dllファイルをアンインストールするときそのネット4のバージョンに変更されているということであり、私はAを取得しています System.BadImageFormatException:ファイルまたはアセンブリをロードできませんでした。 「X」またはその依存関係の1つ。このアセンブリは、aで構築されています ランタイム現在ロードされ、実行時よりも新しくしてロードすることはできません。ファイル 名前: 'X'

ないの誰もがカスタムアクションDLLをロードするために.NET 3.5を呼び出すのではなく、ネット4とのプロセスを開始するためにアンインストーラを伝える方法を知っていますか?どこでこのアンインストール情報は、各製品のために保存されているのでしょうか?そしてどのように?

役に立ちましたか?

解決 3

は、長い研究の後、私はこの問題を解決する方法を発見しました。私は、.NET 4にアプリケーションのバージョンを作って、インストーラを生成しました。それをインストールして、.msiファイルを比較したアプリケーションは、Cに保存されます:\ WINDOWS \ Installerフォルダが同じファイルの以前のバージョンではなく.NET 3.5(元のインストール)で。そして、シャチとの両方のファイルを開き、新しい.NET 4 MSIファイルから.NET 3.5のMSIファイルにいくつかのプロパティの値とバイナリファイルのカップルを変更しました。
今私は(.NET 4の下でアプリを実行して)私も変更する必要があり、それらのネット4バージョンをAppで単一のファイルの更新を行うときに、Cの下にあるアンインストールの.msiファイル:\ WINDOWS \ Installerおよびその後、 Windowsインストーラのアンインストール時に代わりにアプリがインストールされた元のビルドた.NET 3.5のカスタムアクションを行うには、.NET 4を起動します。

ここでの処理および変更MSIファイルと(私はネット4バージョンのMSIから抽出された)は、2つの必要なDLLを渡すだけで、シャチを使用する必要を自動化スクリプトがあります。

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ファイルは、cの下での.Netディレクトリで見つけることができます:\ 4.0バージョンのWindowsは、MSVBDPCADLLという名前の二番目は、まだ私のために謎ですが、私は、生成されたネットのMSIからそれを取り出すことができ4(おそらくあなたはDLLの異なるバージョンを抽出する必要があります、32と64のバージョンの違いがあることができます)。

他のヒント

こんにちは 実行ファイルの名前app.exeのための.NETフレームワークの特定のバージョンをターゲットに、あなたはそれらの行を置くことができます:

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

app.exe.config近い実行可能にという名前のファイルに。ファイルがすでに存在する場合は、ちょうど2つのXMLS(EDITをマージ:これは私が自分のコンピュータ上で持っているものですので、私は「v4.0.30319」を置くが、あなたが持っている1、%WINDIR%\ Microsoftの表情を置く必要があります。 NET \ Frameworkのか、%WINDIR%\ Microsoft.NET \ Framework64)それを得るために。

たぶん、あなたはあなたのソフトウェアをアンインストール実行可能ファイルの名前を知りません。その場合、あなたは(http://www.windowsitpro.com/article/utilities/find-the-source-of-an-error-message.aspx)それを見つけるために、プロセスエクスプローラを使用しようとするかもしれません。

しかし、注意してください:!それゆえ、同じプロセスですべてのランの.NETのFXターゲットを変更しますこれを行うことは(たぶん)このアンインストーラで行われたすべてのアンインストールの動作を変更する

インストーラを窓のどのバージョンを使用していますか?インストーラの古いバージョンを使用している場合は、が望んでいることは3.5フレームワークを使用するように、私は確かに言うことはできませんが、私は疑問に思う。

、セットアッププロジェクトのプロパティを見て確認するには。 「前提条件」をクリックすると、ダイアログボックスの下部までスクロールします。インストールプロセスに使用するバージョンを確認します。

新しいWindowsインストーラを使用すると、それを修正するならば正直なところ、私が持っていたことがありません/この問題に気づいたが、私の不思議ます。

こんにちは、SO!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top