3

EDIT 5/11/2013 : この質問は、当初、REGASM を使用せずに .NET のコードを使用して COM オブジェクトをプログラムで登録する方法を尋ねていました。Yahia の回答は、DLL をプログラムで登録する方法と EXE の両方をカバーしています。

元の質問: 現時点では、既定のバージョンを設定する (regasm を使用してレジストリ エントリを追加する) ときに、UI から呼び出して COM でソフトウェアを登録/登録解除するバッチ スクリプトがあります。スクリプトが失敗した場合にプログラムが失敗を認識しないという問題が発生しているため、バッチ スクリプトを使用したくありません。この問題に対処する方法はいくつかありますが、必要がない場合にコードからバッチ スクリプトを呼び出すという概念は気に入らないので、マネージ コードを使用してソフトウェアを COM に登録する方法に切り替えたいと考えています。

可能だと仮定すると、C# から COM オブジェクトを登録/登録解除するにはどうすればよいですか? グーグルは、インストーラーパッケージからこれを行う方法を見つけるか、regasmを使用するように指示するだけですが、プログラムでこれを行う方法や、それが可能かどうかについての情報は見つかりません.

これについてご支援いただきありがとうございます。

EDIT 5/10/2013 : EXE を COM オブジェクトとして登録することは、DLL を登録することと同じではないようです。.NET (PInvoke は問題ありません) で EXE を COM オブジェクトとして (32 ビット レジストリに) 登録するプログラム的な方法はありますか? これは現在、スクリプトで実行している方法です。アプリと REGCMD 変数は省略形です。

    set app=%PathToTheExecutable%
    set REGCMD=%PathTo32BitRegExe%
    "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\regasm" /tlb /codebase %app%
    %REGCMD% ADD HKCR\CLSID\{app-guid}\LocalServer32 /ve /t REG_SZ /d %app% /f
    %REGCMD% DELETE HKCR\CLSID\{app-guid}\InprocServer32 /f

基本的に、実行可能ファイルで regasm を実行し、exe を LocalServer32 として追加し、InprocServer として関連付けられているエントリを削除します。コードから regasm を呼び出すことなく、プログラムでこれを行うことは可能ですか?

4

2 に答える 2

7

これは C# で実行できますが、ピンボーク、具体的には LoadLibrary / GetProcAddress / FreeLibrary を使用する必要があります。

基本的に、DLL をロードし、その DLL 内の登録/登録解除関数を呼び出してからアンロードする必要があります。

動作する C# ソース コードを含む完全なチュートリアルについては、こちらを参照してください。コメントごとにMSDNを参照してください。

OPが質問を更新した後の更新:

上記の方法は、DLL に対してのみ機能します。

アセンブリ (特に .NET で実装された EXE COM サーバー) を使用する場合、最も簡単で堅牢なオプションは、実際には を使用することregasmです。

本当にプログラムでこれを行う必要がある場合は、次の MSDN リンクを参照してください。

基本的に、EXE をロードしてから、関連するsAssembly.Loadを呼び出す必要があります。RegisterTypeForComClientsType

別のオプションは、これを動的に(実行時に)行うことです-おそらくこれはあなたに役立つでしょう...

于 2013-05-09T14:12:42.653 に答える