VBA / C#COM互操作 - 错误430

时间:2012-01-17 11:06:21

标签: c# excel vba com

我使用的是COM可见的C#库,我在Excel中从VBA调用。调用的C#方法包括ref传递的参数。我正在使用VS2010,Office 2010,.Net framework 4。

  • 在我的Excel文件的早期版本中,对库的调用工作正常,但仍然可以。

  • 在较新的版本中(对C#库的调用本身没有改变),VBA设法调用库,但是当C#方法完成时,我得到一个运行时错误430“类不支持自动化或者不支持预期的界面“。我使用DEBUG模式来查看。在同一个文件中,VBA设法调用已部署的.NET库。

我尝试了什么: - 在VBA中重新添加对OLE自动化库的引用。 - 重新编译C#库

我对可能出错的地方和地方感到有些困惑。 Excel本身似乎不是问题,因为我的旧文件可以工作。 C#库也是从我的旧文件中调用的,所以问题不应该来自库。至于我的文件调用COM可见库的能力,那么对另一个C#库的调用是有效的(部署了一个)。

非常感谢任何帮助!


对csharp的VBA调用如下:

Dim csharptoolsDispatch As Object
Set csharptoolsDispatch = CreateObject("Dispatch.Caller")
Dim a as string
ReDim input(0 to 5) as single 
ReDim output(0 to 5) as single 
a = csharptoolsDispatch.solveDispatch(2, False, input, output)

C#看起来像:

-Interface

namespace Dispatch
{
   public interface iCaller
   {
       string solveDispatch(int a, bool flag, float[] input, ref float[] output);
   }
}

-Class

namespace Dispatch
{
    [ClassInterface(ClassInterfaceType.None)]
    [ComVisible(true)]
    public class Caller : iCaller
    {
        public string solveDispatch(int a, bool flag, float[] input, ref float[] output)
        {    
           //code
           return "ok";
        }
    }
}

对Csharp方法的调用工作正常,Csharp运行良好,在'return“ok''之后,当”焦点“重新回到VBA时,我收到错误430消息。

1 个答案:

答案 0 :(得分:2)

好的,我设法解决了。

事后看来,这是一个非常明显的错误,但是VBA和C#之间的COM互操作界面的奇怪行为使得很难发现。

在对C#的VBA调用中,在参数中,有一个单独的表,它被定义为C#中的int表。该论点在参考文献中传递。

在这种情况下,我希望VBA崩溃说“无效论证”或其他什么。相反,似乎有一个隐式的单个转换为int,使得对C#的调用成为可能。 然后,当csharp方法完成时,VBA似乎无法理解它在ref中传递的参数和更改的类型。这导致430错误。

我的早期版本没有这个错误,因此有效。

我必须记住VBA是非常弱类型!

无论如何,神秘解决了!