2012-01-17 280 views
1

我正在使用从Excel中的VBA调用的COM可见C#库。被调用的C#方法包含由ref传递的参数。我使用VS2010,Office 2010的.NET框架4VBA/C#COM互操作 - 错误430

  • 在我的Excel文件的早期版本,在调用库工作正常,仍然如此。在新版本(C#库调用本身没有改变)中,VBA设法调用库,但是当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#的样子:

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

+0

你能发布实际的产品线吗?该错误消息是说你正在尝试做一些事情,C#interop或Excel不支持你要求它做的事情。由于它适用于该文件的较旧版本,因此您可能会要求Excel 2010使用2003 snytax做某些事情。看到一些代码应该让我们确定是什么。 – Pynner 2012-01-17 17:48:53

+0

刚发布了一些代码。这两个excel文件都是excel 2010文件。 – user1153715 2012-01-18 10:21:43

回答

2

好吧,我设法整理出来。

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

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

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

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

我必须remenber VBA是非常弱键入!

无论如何,神秘解决了!