Visual Studio 2008セットアッププロジェクトからregasmで.NET CCWを登録する方法
-
04-07-2019 - |
質問
.NETサービスアプリケーションのセットアッププロジェクトがあり、COMインターフェイス(COM呼び出し可能ラッパー/ CCW)を公開する.NETコンポーネントを使用しています。 コンポーネントをターゲットマシンで動作させるには、コンポーネントを登録する必要があります
regasm.exe / tlb / codebase component.dll
この場合、typelibを生成する/ tlbスイッチは必須です。そうしないと、そのアセンブリからオブジェクトを作成できません。
問題は、Visual Studio 2008 Setup-Projectを構成して、このアセンブリをregasm / tlbの呼び出しで登録するにはどうすればよいですか?
解決
System.Runtime.InteropServices.RegistrationServicesを代わりに使用して、regasm.exeの手動呼び出しを失う可能性があります。
[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
RegistrationServices regsrv = new RegistrationServices();
if (!regsrv.RegisterAssembly(GetType().Assembly, AssemblyRegistrationFlags.SetCodeBase))
{
throw new InstallException("Failed to register for COM Interop.");
}
}
[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
RegistrationServices regsrv = new RegistrationServices();
if (!regsrv.UnregisterAssembly(GetType().Assembly))
{
throw new InstallException("Failed to unregister for COM Interop.");
}
}
これにより、アンインストール時にライブラリの登録も解除されます。
他のヒント
- メインプロジェクト(登録するクラスを含むプロジェクト)で、プロジェクトファイルを右クリックし、[追加/新規アイテム]を選択して[インストーラークラス]を選択します。 clsRegisterDll.csのようなものを呼び出します
- 表示されたデザイナーで、「ここをクリックしてコードビューに切り替えます」をクリックするか、ソリューションエクスプローラーでclsRegisterDll.csファイルを右クリックして[コードを表示]を選択します
-
Install、Commit、およびUninstallメソッドをオーバーライドして、次を追加します。
// regasmの場所を取得 string regasmPath = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()+ @" regasm.exe&quot ;; // DLLの場所を取得します string componentPath = typeof(RegisterAssembly).Assembly.Location; // regasm
を実行します System.Diagnostics.Process.Start(regasmPath、" / codebase / tlb \"" + componentPath +" \"");アンインストールアクションで/ uを/ codebase / tlbと入れ替えます。
- プロジェクトをコンパイルします
- インストーラーで、dllがアプリケーションフォルダーに追加されていることを確認してから、インストーラープロジェクトを右クリックし、[表示/カスタムアクション]を選択します
- [インストール]を右クリックし、[カスタムアクションの追加]をクリックします
- Application Folderをダブルクリックしてから、dllをダブルクリックします
- コミットアクションについても同じことを行います
- インストーラーのビルドとテスト
実際に試してみたいクラスのチュートリアルは、 http://にあります。 leon.mvps.org/DotNet/RegasmInstaller.html
サービスにはInstallerクラスが必要です。 OnAfterInstallイベントに登録してRegAsmを呼び出します。パスはWindowsディレクトリから計算され、特定の.Netバージョンに関連付けられている必要があります。
最初にインストーラプロセスからregasmを実行してみました(この投稿を見る前に)。 regasmを実行しようとして、すべてのエラーを処理することは問題でした-Windows 7の昇格した特権を処理しようとしない場合でも。
Runtime.InteropServices.RegistrationServices.RegisterAssembly
を使用すると、はるかにクリーンになり、エラートラップが改善されました。
Visual StudioインストーラーはCOMクラスの登録のみを行いますが、タイプライブラリの生成と登録は行いません(これは regasm.exeの
/ tlb
スイッチが行うことです)。デフォルト。少なくともVisual Studio 2017では、 Tlbexp.exe
ユーティリティを使用して登録するDLLのビルド後ステップでタイプライブラリを生成するだけで十分です。
インストーラプロジェクトが、インストールするライブラリと同じディレクトリおよび同じ名前の拡張子 .tlb
を持つファイルを検出した場合、セットアッププロジェクトに自動的に含まれ、登録手順を実行しますインストール中。もちろん、 .tlb
ファイルを手動で生成し、セットアッププロジェクトに含める(およびそのRegisterプロパティを vsdrfCOM
に設定する)こともできます。
こちらは C#およびCOMインターフェイスに関する優れた記事と上記の情報は、Deploymentというセクションから取得されています。