C# 如何使我的C DLL成为自注册DLL

C# 如何使我的C DLL成为自注册DLL,c#,com,registry,registration,installshield,C#,Com,Registry,Registration,Installshield,我已经在C中创建了一个COM对象,后来被VBScript使用。为了使VBScript能够实例化对象,必须对其进行注册。以前,我使用任何.NET Framework提供的RegAsm工具手动注册该对象 但是,我现在正在创建一个安装程序,以便可以在不同的计算机上安装此对象。当我使用InstallShield 2012 Spring Express时,它会警告我dll不是自注册的 如何使DLL自动注册?我已经找到了使用C中的Process对象调用RegAsm的指南和示例,但我的对象不是可执行文件 如果

我已经在C中创建了一个COM对象,后来被VBScript使用。为了使VBScript能够实例化对象,必须对其进行注册。以前,我使用任何.NET Framework提供的RegAsm工具手动注册该对象

但是,我现在正在创建一个安装程序,以便可以在不同的计算机上安装此对象。当我使用InstallShield 2012 Spring Express时,它会警告我dll不是自注册的


如何使DLL自动注册?我已经找到了使用C中的Process对象调用RegAsm的指南和示例,但我的对象不是可执行文件

如果您正在使用InstallShield,您可以要求InstallShield注册您的TypeLib。在Components->DLL->.NET设置->将.NET COM互操作设置为Yes


如果您使用的InstallShield版本不支持此功能,请编写一个自定义操作,调用RegAsm.exe来注册dll。

如果您使用的是InstallShield,则可以要求InstallShield注册Typelib。在Components->DLL->.NET设置->将.NET COM互操作设置为Yes


如果您使用的InstallShield版本不支持此功能,请编写一个自定义操作,调用RegAsm.exe来注册dll。

自定义操作和自注册不是最佳做法

如果您的InstallShield版本不支持COM互操作,请运行以下命令:

regasm foo.dll/regfile:foo.reg

现在将该reg文件导入InstallShield,并将文件foo.dll调整为[INSTALLDIR]foo.dll

如果您的InstallShield版本不支持导入注册表文件,请在记事本中编辑并手动将值输入InstallShield


这是最干净的方法,因为您不会有任何自定义操作失败,而且由于MSI正在处理注册,它知道如何卸载和回滚数据。

自定义操作和自注册不是最佳做法

如果您的InstallShield版本不支持COM互操作,请运行以下命令:

regasm foo.dll/regfile:foo.reg

现在将该reg文件导入InstallShield,并将文件foo.dll调整为[INSTALLDIR]foo.dll

如果您的InstallShield版本不支持导入注册表文件,请在记事本中编辑并手动将值输入InstallShield


这是最干净的方法,因为您不会有任何自定义操作失败,而且由于MSI正在处理注册,它知道如何卸载和回滚数据。

我的InstallShield版本不支持上述操作。自定义操作是什么样子的?我已经将我的dll安装在一个静态位置,用户无法更改它,这意味着我只需要知道如何在自定义操作中调用regasm。我如何找到regasm的路径等?@Tada看看这篇帖子是否有用。创建自定义操作需要一些InstallShield知识。@根据本文,InstallShield Express也支持.NET注册。因此,您的版本没有理由不支持它。这是我的观点,我完全遵循了那篇文章,我得到了错误:-4354:构建无法从组件x.Primary\u输出中的文件x提取COM信息。请确保该文件是自注册的,并验证自注册过程没有失败。明天早上我将首先尝试。我确信regasm DLL_NAME/codebase可以工作,但我还没有尝试使用tlb Switch。我的InstallShield版本不支持上述内容。自定义操作是什么样子的?我已经将我的dll安装在一个静态位置,用户无法更改它,这意味着我只需要知道如何在自定义操作中调用regasm。我如何找到regasm的路径等?@Tada看看这篇帖子是否有用。创建自定义操作需要一些InstallShield知识。@根据本文,InstallShield Express也支持.NET注册。因此,您的版本没有理由不支持它。这是我的观点,我完全遵循了那篇文章,我得到了错误:-4354:构建无法从组件x.Primary\u输出中的文件x提取COM信息。请确保该文件是自注册的,并验证自注册过程没有失败。明天早上我将首先尝试。我知道regasm DLL_NAME/codebase确实有效我还没有尝试使用tlb开关当您需要为/codebase生成注册表文件时,可以这样运行命令:regasm.exe yourpath.DLL/codebase/regfile注册表文件将在您的.DLL文件夹中创建。当您需要为/codebase生成注册表文件时,您可以这样运行命令:RegAsm.exe yourpath.dll/codebase/regfile reg文件将在您的.dll文件夹中创建。