2

我在 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 以更好地处理设置和部署项目。解决我的问题的正确方法是什么?

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

我不知道“正确”的方式,但我的团队用批处理文件解决了这个问题。我们将该文件称为“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 回答
2

WIX,将允许您在 GAC 中轻松安装您的 COM 对象和程序集

威克斯

于 2008-10-02T18:27:49.673 回答