COM注册和GAC
我在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 +与正在编辑的代码版本保持同步(很容易) 。