【问题标题】:COM & Late binding in Excel/VBA: ActiveX component can't create objectExcel/VBA 中的 COM 和后期绑定:ActiveX 组件无法创建对象
【发布时间】:2020-02-20 22:04:03
【问题描述】:

我已经构建了一个 .NET COM 包装器,我在 VBA 中使用它来在 Excel 中运行一个 .NET 程序集。

由于某种原因,我不能使用后期绑定从 .NET COM dll 创建对象。

Set obj = CreateObject("COMwrapper.MyClass")

这会抛出

错误 429:ActiveX 组件无法创建对象

但是,如果我:

  • 使用早期绑定并引用 COMwrapper.tlb
  • 以管理员权限运行 Excel

COMwrapper .NET 项目及其依赖项 .NET DLL 是使用提升到管理员模式的 Visual Studio 2019 构建的,因此它可以在构建过程中注册 COMwrapper。

我还尝试以普通用户身份使用 VS 构建解决方案,而无需注册 COM 包装器。后来我手动运行了具有管理员权限的 regasm.exe。但结果是一样的。

如果我使用 RegDllView.exe (https://www.nirsoft.net/utils/registered_dll_view.html) 查看注册表,COMwrapper DLL 似乎已注册且路径正确。

这就是我设置 COM 部分的方式

类文件

namespace COMwrapper
{
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [Guid("904EBB3C-7A28-490E-B2E5-0CC0C66E907A")]
    public class MyClass : IMyClass

接口文件

namespace COMwrapper
{
    [Guid("540D119F-6676-4CE9-B763-50F4F2976E1E")]
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IMyClass

这以前运行良好!如果我将 DLL 分发到另一台计算机并注册包装器,它可以很好地用于后期绑定。

【问题讨论】:

  • 你能显示任何 C#,不一定是代码,[ComVisible] 的设置等。Set obj = CreateObject("COMwrapper") 是否给出相同的错误?
  • @Nathan_Sav 是的,set obj = CreateObject("COMwrapper") 仍然存在同样的问题。在 .proj 文件中找不到 [ComVisible] 选项,但我在 COMwrapper 的 Visual Studio 2019 项目设置中将该选项设置为 true。
  • 确实是注册表损坏问题。运行 CCleaner,然后它运行良好。

标签: .net vba visual-studio com registry


【解决方案1】:

不是答案,只是支持我的评论。我在 VS2019 上以管理员权限创建了一个 DLL,并且能够通过早期和后期绑定访问。我就是这样设置的

【讨论】:

    猜你喜欢
    • 2014-09-26
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    相关资源
    最近更新 更多