0
我开发了一个成功工作的WCF服务。然后,我在Excel中有一些VBA代码,我按照本指南编写 - http://damianblog.com/2009/07/05/excel-wcf/从Excel中的VBA代码调用WCF函数(带参数)
它正在工作,我用具有参数和返回值的简单函数对它进行了测试 - 它会正确返回结果。我现在需要的是通过引用传递几个参数,在函数中设置它们的值,然后返回。对于我创造了这个测试功能:
// interface...
[OperationContract]
int Read(ref int val1, ref int val2);
// implementation...
public void Read(ref int val1, ref int val2)
{
val1 = 10;
val2 = 20;
}
我把它从VBA模块是这样的:
val1 = 0
val2 = 0
Call service1.Read(val1, val2)
MsgBox val1
MsgBox val2
我到底得的值是20和0,而不是10和20。
是否不支持超过1个'byref'参数或者我在这里做错了什么?
P.S.另一个有趣的事情是我不能将val1声明为整数或long,因为然后service1.Read()调用返回异常“类型不匹配”。它似乎只适用于Variant类型。
编辑:好的,我通过返回函数中的对象数组解决了这个问题。事情是这样的:
// interface...
[OperationContract]
object[] Read();
// implementation...
public object[] Read()
{
return new object[4] { 10, 20, "hello world", DateTime.Now };
}
而在VBA:
Dim val() As Variant
val = service1.Read()
MsgBox val(0)
MsgBox val(1)
MsgBox val(2)
MsgBox val(3)
工作就像一个魅力
没有,很遗憾,我不能。我得到一个异常“必需”类型'属性没有设置。“当我从VBA调用它时。实际上,如果我在接口的任何地方定义了数据契约,那么我无法从VBA调用任何WCF的函数。这里有一个关于这个问题http://stackoverflow.com/questions/8001926/using-a-wcf-service-that-contains-a-datacontract-inside-excel-vba(他结束了使用2个不同的接口来解决问题) – Vampire 2013-04-25 14:06:49
哦,但是当我去了并重新阅读我使用的指南时,你刚刚给了我一个想法。它说:“我发现最好保留原始类型和原始类型的数组,数据契约似乎是不可行的。”我可以使用数组!我可以返回一个对象数组。我需要测试一下 – Vampire 2013-04-25 14:20:44