我有一个 .NET 服务应用程序的安装项目,它使用一个 .NET 组件,该组件公开一个 COM 接口(COM 可调用包装器/CCW)。为了让组件在目标机器上工作,它必须注册到
regasm.exe /tlb /codebase component.dll
在这种情况下,生成类型库的 /tlb 开关是必需的,否则我无法从该程序集创建对象。
问题是,如何配置我的 Visual Studio 2008 Setup-Project 以通过调用 regasm /tlb 来注册此程序集?
我有一个 .NET 服务应用程序的安装项目,它使用一个 .NET 组件,该组件公开一个 COM 接口(COM 可调用包装器/CCW)。为了让组件在目标机器上工作,它必须注册到
regasm.exe /tlb /codebase component.dll
在这种情况下,生成类型库的 /tlb 开关是必需的,否则我无法从该程序集创建对象。
问题是,如何配置我的 Visual Studio 2008 Setup-Project 以通过调用 regasm /tlb 来注册此程序集?
您可以改用 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 字符串的位置 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。
可以在以下位置找到带有实际课程的演练供您尝试:http: //leon.mvps.org/DotNet/RegasmInstaller.html
您的服务应该有一个 Installer 类。注册到 OnAfterInstall 事件并调用 RegAsm:应该从 Windows 目录计算路径并绑定到特定的 .Net 版本。
我最初尝试从安装程序进程运行 regasm(在我看到这个帖子之前)。尝试运行 regasm 并处理所有错误是有问题的 - 即使没有尝试处理 Windows 7 的提升权限。
使用Runtime.InteropServices.RegistrationServices.RegisterAssembly
更干净,并提供了更好的错误捕获。
默认情况下,Visual Studio 安装程序只进行 COM 类注册,但不进行类型库生成和注册(这是/tlb
switch at regasm.exe does
)。至少在 Visual Studio 2017 中,在要使用Tlbexp.exe
实用程序注册的 DLL 的后期构建步骤中生成类型库就足够了。
.tlb
如果安装程序项目在同一目录中发现与您正在安装的库具有相同扩展名的文件,它会自动将其包含到安装项目中,并在安装过程中进行注册步骤。当然,也可以.tlb
手动生成文件并将其包含在安装项目中(并将其 Register 属性设置为vsdrfCOM
)。
这是一篇关于 C# 和 COM 接口的精彩文章,上面的信息来自其名为 Deployment 的部分。