2

Web プロジェクト、C# ライブラリ プロジェクト、および Visual Studio 2005 の Web セットアップ プロジェクトがあります。Web プロジェクトでは、C# ライブラリを GAC に登録する必要があります。これは簡単です。GAC フォルダーをセットアップ プロジェクトに追加し、そこに C# ライブラリのプライマリ出力をドロップするだけです。C# ライブラリも、COM 相互運用のために登録する必要があります。GAC フォルダのプライマリ出力をクリックして選択し、Register プロパティを vsdrpCOM に変更します。セットアップ プロジェクトをビルドして実行しましたが、DLL が COM に登録されません。

これは私にとって本当に驚きではありません。COM の DLL を適切に登録するために、RegistrationServices.RegisterAssembly を使用するカスタム アクションを持つインストーラー クラスを常に追加する必要がありました。そのため、私は何年も受け入れてきたこの回避策を自分の状況に適用します。ここで、セットアップ プロジェクトの GAC フォルダー内のプライマリ出力に割り当てられたカスタム アクションが、セットアップ プロジェクトのビルドを妨げていることがわかりました。

私はいつも、.NET と COM をセットアップ プロジェクトと展開プロジェクトでうまく機能させるために何かをハッキングしているように感じていました。私の問題を解決する適切な方法は何ですか?

4

3 に答える 3

5

アセンブリを COM に登録するには、regasm /codebase を使用します。詳細については、http: //msdn.microsoft.com/en-us/library/tzat5yw6 (VS.80).aspxを参照してください。GAC にインストールする方法は、私には問題ないようです。

于 2008-10-02T20:23:20.753 に答える
2

WIX を使用すると、COM オブジェクトとアセンブリを GAC に簡単にインストールできます。

ウィックス

于 2008-10-02T18:27:49.673 に答える
2

「適切な」方法についてはわかりませんが、私のチームはこの問題をバッチ ファイルで解決しています。このファイルを「cycleCOM.bat」などと呼び、ビルド後に GAC とコンポーネント サービスを更新する必要があるときに実行します。(私は個人的にキーボードランチャーを使用しているので、数回のキープレスでこれをトリガーできます)

これは、バッチ ファイルの非常に単純化されたビューです。

REM Unregister anything currently in component services

RemoveCom+.vbs

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regsvcs /u "C:\source\bin\FooCode.dll"

REM Remove from GAC

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil" /uf FooCode

REM Register in component services

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regsvcs "C:\source\bin\FooCode.dll"

REM Add to GAC

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil" /if "C:\source\bin\FooCode.dll"

RemoveCom+.vbs ファイルは、コンポーネント サービスで実行されているものをすべてシャットダウンします。そのコードは次のとおりです。

set cat = CreateObject ("COMAdmin.COMAdminCatalog")
Set apps = cat.GetCollection("Applications")

bFound = false
apps.Populate

lNumApps = apps.Count

' Enumerate through applications looking for AppName.
Dim app
For I = lNumApps - 1 to 0 step -1
    Set app = apps.Item(I)
    If app.Name = "FooCode" Then
      cat.ShutdownApplication ("FooCode")
      apps.Remove(I)
      apps.SaveChanges
    End If
Next

ローカルで作業するアプリケーションのバージョンごとに、このスクリプトの複数のバージョンがあり、スクリプトを使用すると、GAC と COM+ を編集中のコードのバージョンと同期させることが簡単に (できる限り簡単に) できます。 .

于 2008-10-02T21:34:19.367 に答える