COM注册和GAC

时间:2020-03-06 15:02:28  来源:igfitidea点击:

我在Visual Studio 2005中有一个Web项目,一个Clibrary项目和一个Web安装项目。该Web项目需要Clibrary,需要在GAC中进行注册。这很简单,只需将GAC文件夹添加到设置项目中,然后在其中放置Clibrary的主要输出即可。图书馆也需要注册以进行COM互操作。我单击选择GAC文件夹中的主要输出,然后将Register属性更改为vsdrpCOM。我建立安装项目并运行它,但DLL从未为COM注册。

这对我来说真的不是一个惊喜。我一直必须添加一个安装程序类,该类具有一个自定义操作,该操作使用RegistrationServices.RegisterAssembly为COM正确注册我的DLL。因此,我将我已经接受多年的这种解决方法应用于我的情况。现在,我发现在安装程序项目的GAC文件夹中分配给主要输出的自定义操作会阻止安装程序项目的构建。

我一直觉得自己像是在窃窃私语,以使.NET和COM在设置和部署项目中发挥出色的作用。解决我的问题的正确方法是什么?

解决方案

WIX,将使我们不必大惊小怪地在GAC中安装COm对象和程序集

威克斯

要使用COM注册程序集,请使用:regasm / codebase。有关详细信息,请参见:http://msdn.microsoft.com/zh-cn/library/tzat5yw6(VS.80).aspx。我们安装到GAC的方法对我来说似乎还不错。

我不知道"正确"的方式,但是我的团队使用批处理文件解决了这个问题。我们将文件称为" 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 +与正在编辑的代码版本保持同步(很容易) 。