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

6
我有一个.NET服务应用程序的安装项目,其中使用了一个公开COM接口(COM可调用包装器/CCW)的.NET组件。为了在目标计算机上使该组件正常工作,必须使用以下命令进行注册:
regasm.exe /tlb /codebase component.dll
在这种情况下,使用/tlb开关生成类型库是必需的,否则我将无法从该程序集中创建对象。
问题是,如何配置我的Visual Studio 2008安装项目以通过调用regasm /tlb来注册此程序集?
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.");
}
}

卸载时也会注销该库。


1
这段代码应该添加到哪里?我有一个VB.net项目,需要regasm并且有一些C#依赖项。这两种方法可以添加到实现哪个超类或接口的类中? - Amala
我看到这两个方法进入了一个覆盖System.Configuration.Install.Installer的类,然后将这个单一的类添加为主要输出?我不确定如何将这个类或这些操作添加到安装程序中。它们会随着程序集自动添加吗,还是我需要添加一个操作? - Amala
"我不确定如何将这个类或这些操作添加到安装程序中。" 请参考Wolfwyrd的链接(http://leon.mvps.org/DotNet/RegasmInstaller.html)以获取有关如何将其添加到安装程序包中的详细信息。此答案是对链接文章中代码的修改。 - transistor1

4
  1. 在你的主项目中(包含你要注册的类的项目)右键点击项目文件,选择添加/新建项,然后选择安装程序类。将其命名为clsRegisterDll.cs之类的名称。
  2. 在出现的设计器中,单击“单击此处切换到代码视图”或在解决方案资源管理器中右键单击clsRegisterDll.cs文件并选择“查看代码”
  3. 覆盖Install,Commit和Uninstall方法,添加:

    //获取regasm的位置 string 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。

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

你可以在以下网站找到一个实际类的演示:http://leon.mvps.org/DotNet/RegasmInstaller.html


1

我最初尝试从安装程序进程中运行regasm(在看到这篇文章之前)。尝试运行regasm并处理所有错误是有问题的,即使不尝试处理Windows 7的提升权限。

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


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

0

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

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

这里有一篇很棒的文章,介绍了C#和COM接口,上述信息来自它的部署章节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接