2011-10-18 7 views
10

背景をインストールし登録します。ウィックス中に.NET COM DLLが

私たちのアプリケーションは、非常に大きなアプリケーションのためのプラグインです。私たちが作成するものはすべて、より大きなアプリケーションがフックするDLLファイルです。このため、.NET(C#)では、DLLファイルをCOMインターフェイス用に登録する必要があります。

私たちは作業中のInstallShieldプロジェクトを持っていますが、ここでは取り上げない理由がたくさんありますので、WiXに移行してください。インストーラのために残されている唯一のことは、COMのDLLファイルを登録することです。ここで問題

は、単一のDLLファイルのサンプルコンポーネントです。 How do you register a Win32 COM DLL file in WiX 3?の受け入れ答えを1として

<Component Id="MyComponent" Guid="COMPONENT-GUID" SharedDllRefCount="yes" > 
    <File Id="MyDLL.dll" Name="MyDLL.dll" KeyPath="yes" Assembly=".net" 
      AssemblyManifest="MyDLL.dll" AssemblyApplication="MyDLL.dll" /> 
</Component> 

、ファイルのタグにSelfRegCost=1を追加することをお勧めします。これにより、インストール中にエラーが発生します。

モジュールC:¥Program files¥Product¥MyDll.dllの登録に失敗しました。 HRESULT -2147024769。サポート担当者に連絡してください。

(ロブMenshingによって)同じ質問における第二の答えは、このアプローチに対して推奨していますが、このファイルのタグ内に追加する:として配置するように私は少し混乱しています

<Class Id="PUT-CLSID-HERE" Context="InprocServer32" ThreadingModel="apartment" Description="Your server description"> 
     <ProgId Id="Your.Server.1" Description="Your ProgId description"> 
      <ProgId Id="Your.Server" Description="Your ProgId description" /> 
     </ProgId> 
    </Class> 

    <Class Id="PUT-PROXY-CLSID-HERE" Context="InprocServer32" ThreadingModel="both" Description="Your server Proxies, assuming you have them"> 
     <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface1" /> 
     <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface2" /> 
     <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface3" /> 
     <Interface Id="PUT-INTERFACEID-HERE" Name="IInterface4" /> 
    </Class> 

CLSID ids。生成されたGUIDを入れてインストールしました。それはうまくインストールされましたが、大きなアプリケーションはDLLファイルを見つけることができませんでした。 (私はheat.exeから生成されたインターフェイスのタグを使用する。)

(アダンTegenによって)同じ問題に見られる別のアプローチは、出力を使用MYDLL.DLLアウトmy.wxs

heat.exeファイルを使用することをお勧めします、私は、ファイルのタグにこれを追加します。

<TypeLib Id="Another Guid" Language="0" MagorVersion="1"> 
    <!--Interfaces generated from heat.exe--> 
</TypeLib> 

私はCOMのための.NETを登録しようとしているすべての方法が失敗したと話題についてとても多くの質問を読んだ後、私はそれを行うための正しい方法を知ることにまったく近づいていません。私は何をすべきか? WiXの他のすべてがかなりシンプルなときに、なぜこれは難しい作業ですか?

オリジナルのInstallShieldプロジェクトでは、regasm.exeというカスタムアクションが作成されています。他のすべてが失敗した場合は可能性がありますが、私はむしろ正しいことをしたいと思います。

私はちょうどheat.exe file myDll.dll -scom -o myDll.wxsが私に必要なものと同様のレジストリ値を出力することを発見しました。では、DLLコンポーネント内で新しく作成されたコンポーネントをどのように参照するのですか?

答えて

9

私はちょうどheat.exe file myDll.dll -scom -o myDll.wxsが私に必要なものと同様のレジストリ値を出力していることがわかりました。

確かに-scomですか? AFAIK、そのオプションは実際にCOM登録を抑制する!

ここで、新しく作成したコンポーネントをDLLコンポーネント内でどのように参照しますか?

heat.exeによって生成されたコンポーネントには、DLL用のFile要素が既に含まれています。実際には、DLLファイルをインストールして登録するのに必要なものがすべて含まれています。元の "DLLコンポーネント"は必要ありません。

ファイルとそのCOM登録を別々のコンポーネントに入れる必要がある場合は、heat.exeによって生成されたコンポーネントからFile要素を削除する必要があります。

また、コンポーネントは他のコンポーネントを参照できません。 ComponentGroupの間に参照を入れることができますが、私たちのwixlibsで大きく使用するものはmodel dependenciesですが、それはむしろ高度なユースケースです。

+0

私のでは、単にを追加しますか?私のheat.exeコマンドは何ですか? -scomは、私がグーグルで見つけた提案からのものです。私はCOMの抑制が奇妙だと思ったが、それは私に期待したCSLIDを与えた。 heat.exeファイルmyDll.dll -o mydll.wxs? – SaulBack

+0

"heat.exeファイルmyDll.dll -o mydll.wxs"の出力を使用しました。ありがとう – SaulBack

関連する問題