为什么我的安装项目无法执行我的自定义注册过程

2023-11-22

我正在尝试为我使用 Visual Studio 2008 用 C# 编写的类库驱动程序编写一个安装项目/安装程序。该驱动程序项目有一段代码如下所示...

    [ComRegisterFunction]
    public static void RegisterASCOM(Type t)
    {
        Trace.WriteLine("Registration Started.");
        DoRegistration(true);  
    }

在驱动程序项目“属性”->“程序集信息”中,我已设置选中“Make COM-Visible = true”框。

我在 VS 中的解决方案中添加了一个安装项目,添加了驱动程序项目中的输出 dll,以便它安装在目标计算机上,并将 dll 的 Register 属性设置为“vsdraCOM”。所以,我的理解是,当安装程序运行时,它应该执行标有 [COMRegisterFunction] 的 dll 方法。

使用 SysInternals 调试视图,我可以通过观察窗口中显示的“注册开始”文本来监视何时点击上述代码片段。当我构建解决方案时,我可以看到文本显示,因此我知道驱动程序正在正确注册。问题是,当我运行安装程序时,我认为它没有执行注册位。我在调试视图中看不到任何内容。如果我尝试通过另一个应用程序访问我的驱动程序,我会收到一条错误消息“无法创建 ActiveX 对象”。为什么在安装过程中没有发生注册?

该驱动程序确实注册了 COM,但它不调用我的自定义注册方法。

有人对我可能缺少的东西有建议吗?还有其他方法可以调试这个吗?

(如果有人想看的话我可以提供更多代码!!)


如果安装程序未使用默认机制注册 COM 对象,您可以尝试使用自定义操作强制进行注册。此技术的另一个好处是您可以单步执行自定义操作以了解正在发生的情况。

在你的项目中添加一个继承自Installer的类,用这个属性来装饰

[RunInstaller(true)]  

并重写以下一种或多种方法:

Install()
Uninstall()
Commit()
Rollback()

下面是使用 COM Interop 执行注册的完整示例。它散布着跟踪输出(与某些观点相反),这些输出将显示在 Sysinternals DebugVw 中。当构建在调试配置中时,它将弹出一个对话框,允许您附加调试器并单步执行自定义操作。

using System.ComponentModel;
using System.Configuration.Install;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace TiGra
    {
    /// <summary>
    /// Custom install actions that must be carried out during product installation.
    /// </summary>
    [RunInstaller(true)]
    public class MyInstaller : Installer
        {

        /// <summary>
        /// Custom Install Action that performs custom registration steps as well as
        /// registering for COM Interop.
        /// </summary>
        /// <param name="stateSaver">Not used<see cref="Installer"/></param>
        public override void Install(System.Collections.IDictionary stateSaver)
            {
            Trace.WriteLine("Install custom action - Starting registration for COM Interop");
#if DEBUG
            MessageBox.Show("Attach debugger to this process now, if required", "Custom Action Debug", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
#endif
            base.Install(stateSaver);
            RegistrationServices regsrv = new RegistrationServices();
            if (!regsrv.RegisterAssembly(this.GetType().Assembly, AssemblyRegistrationFlags.SetCodeBase))
                {
                Trace.WriteLine("COM registration failed");
                throw new InstallException("Failed To Register for COM Interop");
                }
            Trace.WriteLine("Completed registration for COM Interop");
            }

        /// <summary>
        /// Custom Install Action that removes the COM Interop component registrations.
        /// </summary>
        /// <param name="savedState">Not used<see cref="Installer"/></param>
        public override void Uninstall(System.Collections.IDictionary savedState)
            {
            Trace.WriteLine("Uninstall custom action - unregistering from COM Interop");
            try
                {
                base.Uninstall(savedState);
                RegistrationServices regsrv = new RegistrationServices();
                if (!regsrv.UnregisterAssembly(this.GetType().Assembly))
                    {
                    Trace.WriteLine("COM Interop deregistration failed");
                    throw new InstallException("Failed To Unregister from COM Interop");
                    }
                }
            finally
                {
                Trace.WriteLine("Completed uninstall custom action");
                }
            }
        }
    }

最后一件事要做。除非安装程序配置为执行自定义操作,否则自定义操作不会运行。就是这样:

  • In your Visual Studio installer project, right click on the project name and select View -> Custom Actions. You'll see a tree view something like this:
    • Custom Actions
      • Install
      • 卸载
      • Commit
      • Rollback
  • 右键单击最顶部的节点(自定义操作)并选择添加自定义操作.
  • 导航到包含用 [RunInstaller(true)] 属性修饰的类的文件或项目输出,突出显示它并单击“确定”。
  • 然后,您的项目输出应该出现在四个节点的每一个下。这意味着您的自定义操作类将在四个安装程序阶段的每个阶段中被调用。

如果您需要对此进行更好的控制,您可以将自定义操作类添加到某些安装程序阶段,但不能添加到其他阶段。例如,如果安装和卸载由不同的程序集处理,则您可以在“安装”和“提交”节点下添加一个程序集,在“卸载”和“回滚”节点下添加另一个程序集。

就是这样,现在将在设置过程中调用您的自定义操作。调试自定义操作的快速提示。在调试版本中使用条件指令(如上例所示)显示消息框。此消息框将在设置过程中显示。这会有效地暂停安装过程,直到您在消息框中单击“确定”,这为您提供了将调试器附加到 msiexec.exe 进程的“机会之窗”(双关语)。将会有多个 msiexec.exe 进程在运行,您需要选择一个显示为托管代码的进程。调试器将连接,并且您的断点将“亮起”,因此您可以拦截执行并单步执行自定义操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的安装项目无法执行我的自定义注册过程 的相关文章

  • 复制 Visual Studio 项目的最快方法/脚本是什么?

    你好 我已经设置了 Visual Studio Express C 项目 其中包含包含头文件和库的路径 现在我喜欢复制这个项目 使其具有与包含的标头和库相同的路径 但对于不同的名称 我不知道如何手动进入 vcproj 文件并开始更改名称 有
  • COM 互操作注册

    我有一个正在暴露的 NET 程序集COM http en wikipedia org wiki Component Object Model 该程序集有两个公共接口和一个公共类 当我构建程序集时 我收到此警告 AssemblyName dl
  • 在 Visual C++ 中创建“添加新项向导”

    也许我没有使用正确的关键字进行搜索 但我无法找到有关如何在 Visual Studio Community 2013 中为 C 项目制作自己的 添加新项向导 的文档 我想要实现的是能够将新的无扩展源文件添加到我的 C 项目中Project
  • 安装python启动文件

    我如何安装pythonstartup文件 以便它在命令上运行 例如python myfile py 我尝试将其安装到我的 home myuserUbuntu的目录 但它说我没有足够的权限 此外 不同的地方交替说它应该全部大写或全部小写 前面
  • 在 Sublime Text 3 中安装多个包

    在 Sublime Text 3 中安装软件包时 我是否可以从列表中勾选所有我想要的软件包 然后一次性安装它们 或者对于我想要安装的每个软件包 我是否必须单击 首选项 gt 软件包控制 gt 安装软件包 例如 Notepad 有一个很好的带
  • (VS2017)运行所选代码生成器时出错:“序列不包含元素”

    我正在跑过微软的教程之一 https learn microsoft com en us aspnet core tutorials first mvc app 关于 MVC 开发 我在尝试创建各种元素时遇到错误 视图 控制器等 我收到的错
  • 主游戏循环中的时间计算

    Quake 2 主游戏循环实现中有这样的代码 if initialized let base retain 16 bits of effectively random data base timeGetTime 0xffff0000 ini
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 引用的程序集自动由 Visual Studio 替换

    我有 2 个项目 一个可移植类库和一个常规单元测试项目 在可移植类库中 我使用 NuGet 来引用 Microsoft BCL 可移植包 它附带 2 个程序集 System Threading Tasks dll and System Ru
  • Xamarin - 错误:dsymutil 退出,代码为 72

    最近升级到 VS for Mac 8 10 21 在构建应用程序时 我得到 Xamarin Shared targets 3 3 Error dsymutil exited with code 72 这是 Xcode 13 3 的情况 完整
  • 如何让 Visual Studio Team Foundation Server 查看我将代码移至其他文件夹?

    我将一些代码从 C 驱动器移至 D 驱动器 当我打开解决方案时 它告诉我 该解决方案似乎处于源代码控制之下 但其绑定 找不到信息 因为无法恢复 自动丢失信息 其绑定的项目 丢失将被视为不受源代码控制 所以我尝试永久删除绑定并下载最新版本 现
  • Python 3.6.1 安装位置

    我在 Ubuntu 16 服务器上安装了 Python 3 6 1 但找不到安装位置 我查看了 usr bin 其中提到了除 3 6 1 之外的所有其他版本 在哪里可以找到该版本的可执行文件 使用命令 whereis python3 6 1
  • 为什么.NET Framework 4.0安装程序的大小小于3.0/3.5?

    我看到 Net Framework 4 0的beta2安装程序只有55MB 而 Net 3 5的安装程序有200 MB 这是怎么回事 NET 3 5 之所以这么大 是因为它在同一个包中包含 x64 版本的框架 2 0 3 0 软件包针对 x
  • 卸载以前的版本安装新版本的安装项目

    我创建了一个安装项目并安装在Windows系统中 在安装安装项目之前 我将其设置为 DetectNewInstallerVersion true and RemovePreviousVersion True 我也每次都换版本 但是 如果我重
  • 为什么 Visual Studio 2008™ 会崩溃? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我知道这个线程 https stackoverflow com questions 96780 why is visual studio consta
  • 部署架构问题

    我也已将应用程序名称和命名空间从 FooXXX 更改为 FooYYY VS 将更改应用于所有文件 我已经检查了所有命名空间 名称等 项目编译 但是当我想将其部署到模拟器或设备时 它会立即崩溃 没有战争 没有消息 没有例外 仅显示启动屏幕 然
  • Blazor WebAssembly 项目无法引用 NETCore 类库

    我尝试从 Blazor WebAssembly 项目引用类库 但收到一条错误 指出 Blazor WebAssembly 项目无法引用 ASP NET Core 共享框架项目 我尝试将类库目标更改为 Net Framework 但这会破坏它
  • 在 Visual Studio 中继承构建后事件?

    我在 Visual Studio 中有一个解决方案 其中有一个共享属性表 其中包含构建后事件命令 bar 需要为每个项目执行 Foo props gt 通用属性 gt 构建事件 gt 构建后事件 gt 命令行 栏 然后 我如何指定其他特定于
  • 如何为 Windows 安装开源 Qt 库 5 二进制版本

    这个问题具体是关于Qt libraries 5 0 0 for Windows VS 2010 406 MB at http qt project org downloads http qt project org downloads 但我

随机推荐

  • 为什么 .NET Reactive Extensions 中不推荐使用主题?

    我目前正在掌握 NET 的响应式扩展框架 并且正在研究我找到的各种介绍资源 主要是http www introtorx com 我们的应用程序涉及许多检测网络帧的硬件接口 这些将是我的 IObservables 然后我有各种组件将消耗这些帧
  • 如何在不使用框架集的情况下仅缩放 IFRAME 内容?

    我只需要缩放框架内容 在我的网页中我使用了zoom 0 75 height 520px width 800px 如果我增加缩放值 则意味着帧尺寸将会增加
  • glClear() 如何提高性能?

    Apple 关于解决闪烁问题的技术问答 QA1650 包括以下段落 强调我的 您必须为屏幕上的每个像素提供一种颜色 在绘图代码开始时 最好使用 glClear 来初始化颜色缓冲区 在帧开始时全屏清除每种颜色 深度和模板缓冲区 如果您正在使用
  • SMJobSubmit() 可以用来执行 SMJobBless 安装的特权助手吗?

    我一直在阅读文档和 SMJobBless 示例以及互联网上的各种讨论 我的应用程序现在使用安装特权助手SMJobBless 但助手根本不运行 帮助程序的全部目的是在应用程序启动时加载 kext 这是我的应用程序的重要组件 我看到的例子表明
  • zend 形式的数组输入,如 name="person[]"

    在普通的 html 中 我们可以有一个数组字段 例如person
  • 单个 Prisma 查询中的 LEFT JOINS 和聚合

    我有一个包含多个表的数据库 经常需要查询LEFT JOIN以便结果包含来自其他表的聚合数据 我的 Prisma 架构的片段 model posts id Int id unique default autoincrement user id
  • 使用变量作为格式指令的前缀参数

    我需要打印一些前面有可变数量空格的内容 例如 如果我需要在文本前打印 5 个空格 我会这样做 format T 5T My Text Output My Text 我可以使用变量来代替 5 并能够向其传递值吗 我正在寻找的是这样的 form
  • Twilio React Native - 无法解析模块加密

    我正在努力实施twilio打包到我的反应本机项目中 当我在文件中需要它时 项目将无法加载 并且我看到以下错误 Unable to resolve module crypto from Users myname Documents Proje
  • AWS 和 Terraform - 安全组中的默认出口规则

    我在许多提供者是 AWS 的 Terraform 项目中看到了可重复的配置 配置出站 出口 规则以允许所有出站流量 据我了解 这是 AWS 中的默认行为 如AWS 用户指南 默认情况下 安全组包含允许所有出站流量的出站规则 您可以删除规则并
  • Delphi有没有允许路径编辑的编辑控件?

    我有各种层次结构 并且希望使用编辑器 例如下面的资源管理器地址栏中找到的 Microsoft 编辑器 进行导航 Delphi有这样的组件吗 付费还是免费 TMS 的 TAdvExplorerTreeview 可能就是您所寻找的 http w
  • 如何基于 stanford-nlp 条件随机场模型训练法国 NER?

    我发现了 stanford NLP 的工具 发现它真的很有趣 我是一名法国数据挖掘者 数据科学家 喜欢文本分析 并且很想使用你们的工具 但是 NER 在法语中不可用 这让我很困惑 我很想制作自己的法语 NER 如果认为值得的话 甚至可能将其
  • 我可以从 scala 中的重载方法中获取函数吗?

    假设我定义了两个具有相同名称和返回值但参数不同的方法 def overload x Int x toString def overload s String s 现在我想将其中之一转换为函数 如果该方法没有重载 我会这样做 val f ov
  • 继承自 ObservableCollection 的集合 - 有什么好处?

    看完之后这篇 MSDN 文章 我现在想知道将集合定义为继承自的类有什么好处 如果有的话 ObservableCollection 这之间是否有任何显着差异 class MyCollection ObservableCollection
  • 使用基于 $resource 的服务进行部分更新(又名 PATCH)?

    我们正在使用 Django TastyPie 作为后端 REST 服务提供者构建一个 Web 应用程序 并构建一个基于 AngularJS 的前端 使用大量基于 resource 的服务来对服务器上的 CRUD 对象进行处理 到目前为止一切
  • XSLT 1.0 三元 if 的惯用语?

    该 Java 程序使用三元 if 将布尔值映射到输出字符串 表示 true 空字符串表示 false public class ternary public static void main String args boolean flag
  • Java Socket - 本地端口

    我正在学习 Java 的套接字编程 我使用以下语句连接到网站 s new Socket www nba com 80 当我调试应用程序并查看 s 的内容时 我看到 Socket addr www nba com 2 21 246 97 po
  • 多模块 m2eclipse/WTP 项目能否将实用程序模块部署到 WEB-INF/类中?

    我们目前使用 MyEclipse 及其内置 Maven4MyEclipse 集成和内置 J2EE 服务器支持 但希望转换为常规 Eclipse 特别是 Helios 以便能够在 Windows 上使用其 64 位安装 MyEclipse 尚
  • Swift 4 UICollectionView 检测滚动结束

    我有一个Horizontal UICollectionView在我的应用程序上 当用户在左侧拖动时到达 UICollectionView 的末尾 或接近末尾 时 我想加载更多数据 我正在使用 Swift 4 我找到了一些 Swift 3 解
  • C# 中的 Powershell 命令

    我正在尝试查询 root CIMV2 命名空间中所有 WMI 类的名称 有没有办法使用 powershell 命令在 C 中检索此信息 沿着基思的方法 using System using System Management Automat
  • 为什么我的安装项目无法执行我的自定义注册过程

    我正在尝试为我使用 Visual Studio 2008 用 C 编写的类库驱动程序编写一个安装项目 安装程序 该驱动程序项目有一段代码如下所示 ComRegisterFunction public static void Register