2009-05-14 17 views
2

Windows 2008 Server x64にMSBuildとInstallShieldを使用する際に問題があります。 InstallShieldチームが提供するMSBuildタスクを使用してInstallShieldプロジェクトをビルドしようとしましたが、C:\ Windows \ Microsoft.NET \ Framework \ 3.5 \からmsbuildを実行するとうまく動作します。 I`veは誤りだ\ 3.5 \ Frameworkのを\ NET:win2008 x64でInstallShield msbuildタスクをプログラムでビルドするにはどうすればよいですか?

The "InstallShield.Tasks.InstallShield" task could not be loaded from the assembly c:\Program Files (x86)\MSBUILD\InstallShield\2009\InstallShield.Tasks.dll. Could not load file or assembly 'file:///c:\Program Files (x86)\MSBUILD\InstallShield\2009\InstallShield.Tasks.dll' or one of its dependencies. An attempt was made to load a program with an incorrect format. Confirm that the declaration is correct, and that the assembly and all its dependencies are available.

をそして、いつもの "フレームワークのパスを使用しても大丈夫でしょうがx64のパスのinstaedしかし残念ながら、私はそのエンジンを使用してプログラムMSBUILDを使用する必要があります、 、それは2.0のバージョンのフレームワーク用と3.5用の2つのツールセットしか返しません。しかし、どちらもFramework64のパスの下にあります...自分のToolsetに '通常の' Frameworkディレクトリへのパスを追加しようとしました。私はレジストリとprogrammaticalyを介してそれをやろうとしましたが、動作しませんでした - DefaultToolsVersionは自分の値に設定されていました、パスはフレームワークに見えます、私のバージョンのToolsetはツールセットのコレクションに追加されました。 。プロジェクトをビルドです コード:

 Project project = new Project(engine); 
     //Toolset customToolset = new Toolset("4.0", @"c:\windows\Microsoft.Net\Framework\v3.5\"); 
     //engine.Toolsets.Add(customToolset); 
     //engine.DefaultToolsVersion = "4.0"; 

     project.Load(args[0]); 

     MSBuildLogger logger = new MSBuildLogger(); 
     engine.RegisterLogger(logger); 

     bool res = engine.BuildProjectFile(args[0]); 

誰もが、私はそれを動作させるために何をすべきかのアイデアを持っていますか?


私はこの問題を、AnyCPUではないx86プラットフォームでコンパイルすると思われます。しかし、別の解決策があるかもしれませんか?

答えて

1

はい、InstallShieldのビルドは、32ビットであり、それに応じて、32ビット・ロケーションへのMSBuildのサポートをインストールします。あなたのMSILプロジェクトはx64マシン上で64ビットとして動作しますので、将来的にMSBuild自体がこの問題を回避する可能性がありますが、あなたのビルダーx86を作るソリューションはおそらく最高です。いくつかの点であなたはあなたでは、InstallShieldのMSBuildタスクを必要とするよりも、64ビット以上が必要な場合は

は、あなたの他の頼みの綱は、コマンドラインビルドでExecのタスクを使用することです。

2

問題の根本は、アセンブリMacrovision.InstallShield.Tasks.dllがタイプセーフな(管理されたネイティブコード混在/ IJW)で、x86アーキテクチャのみで動作することです。 Macrovisionはここで、特定のアーキテクチャ向けにすばらしいinteropアセンブリのモジュール化を行うのに失敗しました。 Macrovision.InstallShield.Tasks.dllのタスクは、MSIパッケージを構築するためのネイティブツールに依存します。これらのネイティブツールは、x86アーキテクチャでしか使用できないため、依存関係になります。

マクロビジョンでは、MSBuild用の型セーフ(AnyCPU/PURE)タスクアセンブリを作成し、アーキテクチャー固有のコードをデプロイし、特定のアーキテクチャ(最も顕著なx86およびAMD64)の相互運用アセンブリに呼び出す必要があります。このようにして、MSBuildや他のタスクコンシューマのコンシューマが動作します(もちろん、特定のアーキテクチャの特定のinteropアセンブリが存在する限り)。

おそらくあなたの問題を回避するための最良の方法はAnyCPUとしてプロジェクトをコンパイルし、32ビットのMSBuildを実行することです。または、32ビットCLRまたはプロセスを起動し、Macrovisionのアセンブリを使用します。

関連する問題