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

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

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

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

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

我对有什么可能是错的,在哪里有点困惑。 Excel本身似乎不是问题,因为我的旧文件的作品。 C#库也从我的旧文件调用,所以问题不应该来自库。 至于我的文件调用COM可见库的能力,以及另一个C#库的调用工作(部署一个)。

任何帮助将非常感激!


VBA调用csharp如下:

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#看起来像:

-接口

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

-类

 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运行正常,在“返回”ok“后,当”焦点“返回到VBA时,我得到错误430消息。

好吧,我设法把它整理出来。

事后看来,这是一个非常明显的错误,但是来自VBA和C#之间的COM interop接口的怪异行为使得难以发现。

在调用C#的VBA中,参数之间有一个单一的表格,在C#中被定义为一个int表格。 这个论点在参考文献中被传递。

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

我以前的版本没有这个错误,因此工作。

我必须重新inputVBA是非常弱的types!

无论如何,神秘的解决!