2011-07-17 1 views
6

悲しいことに、悲しいことに、悲惨です。 Wixがなぜ.NETアセンブリSOOOOOOのインストールを難しくしているのですか?Wix!(bind.AssemblyFullName.fileId)はGACedアセンブリでのみ動作しますか?

.NETで実装されているCOM Inprocess Serverをインストールしています。私のWixインストールでは、レジストリエントリを作成する必要があります。私はこれをやりたいとは思わない、私はむしろWixにRegAsmと同等のものがあっただろうが、私はこれを手動でやらせる。私はこれがあまりにも難解だと示唆して燃えてしまったので、私はあきらめて宣言的なやり方をしました、良い少年のように。だから、ここに私のレジストリのものが今のようになります:

<File Id="filDriverAssembly" Source="$(var.TiGra.Astronomy.AWRDriveSystem.TargetPath)" KeyPath="yes" Vital="yes" Assembly=".net"> 
    <!--<Class Context="InprocServer32" Description="$(var.InstallName)" Id ="$(var.DriverGuid)" ThreadingModel ="both" > 
    <ProgId Description="$(var.InstallName)" Id ="$(var.DriverId)" /> 
    </Class>--> 
</File> 
<RegistryKey Root="HKCR" Key="$(var.DriverId)" Action="createAndRemoveOnUninstall"> 
    <RegistryValue Type="string" Value="$(var.DriverTypeName)"/> 
    <RegistryKey Key="CLSID"> 
    <RegistryValue Type="string" Value="$(var.DriverGuid)" /> 
    <RegistryKey Key="$(var.DriverGuid)"> 
     <RegistryValue Type="string" Value="$(var.DriverTypeName)"/> 
     <RegistryKey Key="InprocServer32"> 
     <RegistryValue Type="string" Value="mscoree.dll" /> 
     <RegistryValue Type="string" Name="ThreadingModel" Value="Both"/> 
     <RegistryValue Type="string" Name="Class" Value="$(var.DriverTypeName)"/> 
     <RegistryValue Type="string" Name="Assembly" Value="!(bind.AssemblyFullName.filDriverAssembly)"/> 
     <RegistryValue Type="string" Name="RuntimeVersion" Value="2.0.50727"/> 
     <RegistryValue Type="string" Name="CodeBase" Value="file:///[#filDriverAssembly]" /> 
     <RegistryKey Key="!(bind.fileVersion.filDriverAssembly)" > 
      <RegistryValue Type="string" Name="Class" Value="$(var.DriverTypeName)"/> 
      <RegistryValue Type="string" Name="Assembly" Value="!(bind.AssemblyFullName.filDriverAssembly)"/> 
      <RegistryValue Type="string" Name="RuntimeVersion" Value="2.0.50727"/> 
      <RegistryValue Type="string" Name="CodeBase" Value="file:///[#filDriverAssembly]" /> 
     </RegistryKey> 
     </RegistryKey> 
     <RegistryKey Key="ProgId"> 
     <RegistryValue Type="string" Value="$(var.DriverId)" /> 
     </RegistryKey> 
     <RegistryKey Key="Implemented Categories"> 
     <RegistryKey Key="{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" /> 
     </RegistryKey> 
    </RegistryKey> 
    </RegistryKey> 
</RegistryKey> 
<!-- Wow6432Node for x86 compatibility, installed only on x64 systems --> 
<!-- HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node --> 
<?if $(var.Win64) = "yes" ?> 
<RegistryKey Root="HKCR" Key="Wow6432Node" Action="createAndRemoveOnUninstall"> 
    <RegistryKey Key="CLSID"> 
    <RegistryValue Type="string" Value="$(var.DriverGuid)" /> 
    <RegistryKey Key="$(var.DriverGuid)"> 
     <RegistryValue Type="string" Value="$(var.DriverTypeName)"/> 
     <RegistryKey Key="InprocServer32"> 
     <RegistryValue Type="string" Value="mscoree.dll" /> 
     <RegistryValue Type="string" Name="ThreadingModel" Value="Both"/> 
     <RegistryValue Type="string" Name="Class" Value="$(var.DriverTypeName)"/> 
     <RegistryValue Type="string" Name="Assembly" Value="!(bind.AssemblyFullName.filDriverAssembly)"/> 
     <RegistryValue Type="string" Name="RuntimeVersion" Value="2.0.50727"/> 
     <RegistryValue Type="string" Name="CodeBase" Value="file:///[#filDriverAssembly]" /> 
     <RegistryKey Key="!(bind.assemblyVersion.filDriverAssembly)" > 
      <RegistryValue Type="string" Name="Class" Value="$(var.DriverTypeName)"/> 
      <RegistryValue Type="string" Name="Assembly" Value="!(bind.AssemblyFullName.filDriverAssembly)"/> 
      <RegistryValue Type="string" Name="RuntimeVersion" Value="2.0.50727"/> 
      <RegistryValue Type="string" Name="CodeBase" Value="file:///[#filDriverAssembly]" /> 
     </RegistryKey> 
     </RegistryKey> 
     <RegistryKey Key="ProgId"> 
     <RegistryValue Type="string" Value="$(var.DriverId)" /> 
     </RegistryKey> 
     <RegistryKey Key="Implemented Categories"> 
     <RegistryKey Key="{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}" /> 
     </RegistryKey> 
    </RegistryKey> 
    </RegistryKey> 
</RegistryKey> 
<?endif ?> 

ます。regasmは、えっ、弱虫のためにあるのですか?とにかく、いくつかのレジストリキーを作成するために、アセンブリのフルネームを取得する必要があることに注意してください。バインダー変数、具体的にはValue="!(bind.AssemblyFullName.filDriverAssembly)"を使用しています。

これは、ファイルエントリに属性Assembly=".net"を追加しない限りうまくいきません。私はその属性を追加しない場合、または私はAssembly="no"を使用している場合、私は

エラー2未解決のバインド時間変数 !(bind.AssemblyFullName.filDriverAssembly)を取得します。

私は、ファイル項目にAssembly=".net"を追加すると、その後、バインダー変数はうまく動作しますが、ウィックスは、私が欲しいものませであるグローバルアセンブリキャッシュ、に私のアセンブリを置きます!ちょっと、あなた。

GACに入っていないWixプロジェクトでアセンブリのフルネームを照会することはできませんか?なぜこれらの2つのことがお互いに依存しているのですか?

答えて

6

ファイルがアセンブリとしてマークされていない限り、他のファイルと同じです。 WiXはアセンブリ属性を持っている可能性はないと考えています。 AssemblyApplication属性をチェックしてください:適切なファイルに設定して、ファイルがGACに入ったことをMSIに伝えずに@Assembly = ".net"を設定することができます。

+0

これはドキュメントからどのように動作するか分かりませんが、例を挙げることはできますか?その属性は、NGENがネイティブアセンブリを生成するように強制するNativeAssemblyキーでのみ有効であるようです。私はアセンブリをNGENしたくない。それは同じ問題です、すべてが2つの意味を持っています。私はアセンブリからメタデータを取得して、インストールプロセスの別の部分で使用したいだけです。 –

+0

また、私のアセンブリは、多くのアプリケーションによって読み込まれる汎用アイテムですが、その中にはまだ存在しないものがあります。 「このアセンブリをロードするアプリケーション」をどのように指定する必要がありますか? –

+0

私はFile/@ AssemblyApplication属性について話しています。 –

関連する問題