如何在 Visual Studio 2008 安装项目中使用 regasm 注册 .NET CCW

Posted

技术标签:

【中文标题】如何在 Visual Studio 2008 安装项目中使用 regasm 注册 .NET CCW【英文标题】:How to register a .NET CCW with regasm from a Visual Studio 2008 Setup project 【发布时间】:2008-10-27 09:58:26 【问题描述】:

我有一个 .NET 服务应用程序的安装项目,它使用一个 .NET 组件,该组件公开一个 COM 接口(COM 可调用包装器/CCW)。 为了让组件在目标机器上工作,它必须注册到

regasm.exe /tlb /codebase component.dll

在这种情况下,生成类型库的 /tlb 开关是必需的,否则我无法从该程序集创建对象。

问题是,如何配置我的 Visual Studio 2008 Setup-Project 以通过调用 regasm /tlb 来注册此程序集?

【问题讨论】:

【参考方案1】:

您可以改用 System.Runtime.InteropServices.RegistrationServices 来失去对 regasm.exe 的手动调用:

[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
public override void Install(IDictionary stateSaver)

base.Install(stateSaver);

RegistrationServices regsrv = new RegistrationServices();
if (!regsrv.RegisterAssembly(GetType().Assembly, AssemblyRegistrationFlags.SetCodeBase))

    throw new InstallException("Failed to register for COM Interop.");




[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
public override void Uninstall(IDictionary savedState)

base.Uninstall(savedState);

RegistrationServices regsrv = new RegistrationServices();
if (!regsrv.UnregisterAssembly(GetType().Assembly))

    throw new InstallException("Failed to unregister for COM Interop.");


这也会在卸载时取消注册库。

【讨论】:

这段代码应该添加到什么地方?我有一个需要 regasm 并且有一些 C# 依赖项的 VB.net 项目。这两个方法可以添加到实现哪个超类或接口的类中? 我看到这两个方法进入了一个覆盖 System.Configuration.Install.Installer 的类,然后这个类被添加为主要输出?我不确定如何将此类或这些操作添加到安装程序。它们会自动添加到程序集中还是我需要添加操作? "I am not sure how to add this class or these actions to the installer." 请参阅另一个答案中的link from Wolfwyrd,了解有关如何将其添加到安装程序包的详细信息。这个答案是对链接文章中代码的修改。【参考方案2】:
    在您的主项目(包含您要注册的类的项目)中,右键单击项目文件并选择添加/新建项目并选择安装程序类。称它为 clsRegisterDll.cs 之类的东西 在出现的设计器中,单击“单击此处切换到代码视图”或右键单击解决方案资源管理器中的 clsRegisterDll.cs 文件并选择查看代码

    覆盖安装、提交和卸载方法添加:

    // 获取 regasm 的位置 字符串 regasmPath = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory() + @"regasm.exe"; // 获取我们 DLL 的位置 string componentPath = typeof(RegisterAssembly).Assembly.Location; // 执行 regasm System.Diagnostics.Process.Start(regasmPath, "/codebase /tlb \"" + componentPath + "\"");

    在卸载操作中将 /codebase /tlb 替换为 /u。

    编译您的项目 在您的安装程序中,确保您已将 dll 添加到应用程序文件夹,然后右键单击安装程序项目并选择查看/自定义操作 右键单击安装,然后单击添加自定义操作 双击应用程序文件夹,然后单击您的 dll 对 Commit 操作执行相同操作 构建并测试您的安装程序

可以在以下位置找到包含实际课程的演练供您尝试:http://leon.mvps.org/DotNet/RegasmInstaller.html

【讨论】:

【参考方案3】:

您的服务应该有一个 Installer 类。 注册到 OnAfterInstall 事件并调用 RegAsm:路径应从 Windows 目录计算并绑定到特定的 .Net 版本。

【讨论】:

【参考方案4】:

我最初尝试从安装程序进程运行 regasm(在我看到此帖子之前)。尝试运行 regasm 并处理所有错误是有问题的 - 即使没有尝试处理 Windows 7 的提升权限。

使用Runtime.InteropServices.RegistrationServices.RegisterAssembly 更简洁,并提供更好的错误捕获。

【讨论】:

【参考方案5】:

Visual Studio 安装程序默认只进行 COM 类注册,但不进行类型库生成和注册(这是 /tlb 切换到 regasm.exe does 的内容)。至少在 Visual Studio 2017 中,在要使用 Tlbexp.exe 实用程序注册的 DLL 的后期构建步骤中生成类型库就足够了。

如果安装程序项目在与您正在安装的库相同的目录中发现扩展名为 .tlb 的文件,它会自动将其包含到安装项目中,并在安装过程中进行注册步骤。当然也可以手动生成.tlb文件并将其包含在安装项目中(并将其Register属性设置为vsdrfCOM)。

这是一个关于 C# 和 COM 接口的great article,上面的信息来自其名为 Deployment 的部分。

【讨论】:

以上是关于如何在 Visual Studio 2008 安装项目中使用 regasm 注册 .NET CCW的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2008 安装项目中使用 regasm 注册 .NET CCW

如何在visual studio2008中创建,编译和运行C++程序,

如何让Visual Studio 2008编辑SSRS 2005报表项目没有安装SQL Business Intelligence Development Studio 2005?

visual studio 2008的ISO文件有3.70GB,为啥有这么大?

如果我没有安装本机客户端,Visual Studio 2010如何连接到SQL Server 2008?

启动visual studio 2008后显示对话框: visual studio的试用版评估期已结束。 如何解决。