【发布时间】: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