6

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

regasm.exe /tlb /codebase component.dll

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

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

4

5 回答 5

14

您可以改用 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.");
}
}

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

于 2009-12-10T19:49:56.500 回答
4
  1. 在您的主项目(包含您要注册的类的项目)中,右键单击项目文件并选择 Add / New Item 并选择 Installer Class。称它为 clsRegisterDll.cs
  2. 在出现的设计器中,单击“单击此处切换到代码视图”或右键单击解决方案资源管理器中的 clsRegisterDll.cs 文件并选择查看代码
  3. 覆盖安装、提交和卸载方法,添加:

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

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

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

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

于 2009-01-15T12:12:27.220 回答
1

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

于 2008-10-27T11:45:51.913 回答
1

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

使用Runtime.InteropServices.RegistrationServices.RegisterAssembly更干净,并提供了更好的错误捕获。

于 2011-08-25T12:01:09.110 回答
0

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

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

这是一篇关于 C# 和 COM 接口的精彩文章,上面的信息来自其名为 Deployment 的部分。

于 2019-06-29T15:27:23.077 回答