我使用的是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消息。
答案 0 :(得分:2)
好的,我设法解决了。
事后看来,这是一个非常明显的错误,但是VBA和C#之间的COM互操作界面的奇怪行为使得很难发现。
在对C#的VBA调用中,在参数中,有一个单独的表,它被定义为C#中的int表。该论点在参考文献中传递。
在这种情况下,我希望VBA崩溃说“无效论证”或其他什么。相反,似乎有一个隐式的单个转换为int,使得对C#的调用成为可能。 然后,当csharp方法完成时,VBA似乎无法理解它在ref中传递的参数和更改的类型。这导致430错误。
我的早期版本没有这个错误,因此有效。
我必须记住VBA是非常弱类型!
无论如何,神秘解决了!