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的主要内容,如果未能解决你的问题,请参考以下文章

在 GAC 注册的消费程序集

GAC(Global Assembly Cache)注册/卸载 dll

C# 注册DLL至GAC 并在添加引用中使用该DLL

CRM 插件导入

PB调用.NET类库详解

Vue 全局注册组件和局部注册组件