COM 注册和 GAC
Posted
技术标签:
【中文标题】COM 注册和 GAC【英文标题】:COM Registration and the GAC 【发布时间】:2010-09-14 21:25:23 【问题描述】:我在 Visual Studio 2005 中有一个 Web 项目、一个 C# 库项目和一个 Web 设置项目。该 Web 项目需要 C# 库需要在 GAC 中注册。这很简单,只需将 GAC 文件夹添加到安装项目并将 C# 库的主要输出放在那里。 C# 库还需要为 COM 互操作注册。我单击选择 GAC 文件夹中的主要输出并将 Register 属性更改为 vsdrpCOM。我构建了安装项目并运行它,但 DLL 从未为 COM 注册。
这对我来说并不意外。我总是不得不添加一个安装程序类,它有一个自定义操作,它使用 RegistrationServices.RegisterAssembly 正确注册我的 COM DLL。因此,我将多年来接受的这种解决方法应用于我的情况。现在我发现在安装项目的 GAC 文件夹中分配给主要输出的自定义操作甚至会阻止安装项目的构建。
我一直觉得我是在利用黑客技术让 .NET 和 COM 与设置和部署项目配合得很好。解决我的问题的正确方法是什么?
【问题讨论】:
【参考方案1】:要使用 COM 注册程序集,请使用:regasm /codebase。详情请参阅:http://msdn.microsoft.com/en-us/library/tzat5yw6(VS.80).aspx。您安装到 GAC 的方法对我来说似乎很好。
【讨论】:
【参考方案2】:WIX,将允许您在 GAC 中轻松安装您的 COM 对象和程序集
WIX
【讨论】:
【参考方案3】:我不知道“正确”的方式,但我的团队使用批处理文件解决了这个问题。我们将该文件称为“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+ 与正在编辑代码。
【讨论】:
以上是关于COM 注册和 GAC的主要内容,如果未能解决你的问题,请参考以下文章