【问题标题】:Cannot call C# library exposed through COM in Excel VBA无法在 Excel VBA 中调用通过 COM 公开的 C# 库
【发布时间】:2013-05-16 05:43:04
【问题描述】:

我尝试创建一个非常基本的 C# 库并通过 COM 接口公开它,以便我可以从 VBA 访问它,但在运行时它会抛出错误“类不支持自动化或不支持预期的接口”

我已阅读所有在线教程并完全按照说明完成,所以我很困惑为什么会这样。我的基础课是

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace PDCCOMTest
{

    [ComVisible(true)]
    public interface IPDCCOMTest
    {
        string SubmitRequest(string requestXML);
    }

    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [ComSourceInterfaces(typeof(IPDCCOMTest))]
    [ProgId("PDCCOMTest.PDCCOMTest")]
    public class PDCCOMTest : IPDCCOMTest
    {
        public string SubmitRequest(string requestXML)
        {
            return "hello world";
        }
    }
}

在项目设置中,我进入了应用程序 -> 程序集信息 -> 使程序集 COM 可见(设置为 ON)并构建 -> 注册 COM 互操作(设置为 ON)

我编译并构建解决方案,然后加载 Excel 并设置基本按钮宏表。在此,我转到 References 并在 COM 对象列表下,出现我的新 C# COM 程序集并检查它。然后,我可以使用 Intellisense 发现类型,并且 Intellisense 提供了 SubmitRequest 方法,因此一切正常。 VBA代码如下

Private Sub CommandButton1_Click()
    Dim oObj As New PDCCOMTest.PDCCOMTest
    Dim text As String
    test = oObj.SubmitRequest("test")
End Sub

当我然后运行工作表并单击按钮时,它会在上面 Sub 的最后一行,即 SubmitRequest() 行中引发错误

“错误 430:类不支持自动化或不支持预期的接口”

谁能建议我忽略了什么以及为什么会发生这种情况?

谢谢, 詹姆斯

【问题讨论】:

  • 可能与它无关,但您的 vba 代码中有 texttest
  • 啊好地方。它没有修复错误,但感谢您指出这一点
  • 去掉ClassInterface(ClassInterfaceType.None)属性
  • 您的界面需要一个 GUID,您的班级需要另一个 GUID
  • 好的,看来我找到了解决方案。在程序文件目录中的 Excel.exe.config 中,有一行 如果我将其设置为 false 它可以工作,那么显然 .NET 运行时版本控制存在一些问题。知道为什么会这样以及如何在我的 VS2010 项目中修复它,以便我可以将此选项保留为“TRUE”并让它成功吗?

标签: c# vba com interop


【解决方案1】:

这适用于我的机器,因此您的代码可能没问题。如果我冒险猜测,我会说它看起来像一个 .NET 加载问题,即 Excel 加载了一些其他 .NET 加载项并加载了 CLR v1 等。

看看this SO answer - 希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2012-05-21
    • 1970-01-01
    • 2013-12-10
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2016-10-07
    • 2017-09-10
    相关资源
    最近更新 更多