如何在 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,为啥有这么大?