2013-04-25 118 views
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) 

工作就像一个魅力

回答

0

您可以将您的结构和WCF方法返回回来?我的意思是不是

int Read(ref int val1, ref int val2); 

,这样做

[DataContract] 
struct MyDataStructure { 

[DataMember] 
int val0; 

[DataMember] 
int val1; 

[DataMember] 
int val2; 

} 

... 

MyDataStructure Read(); 
+0

没有,很遗憾,我不能。我得到一个异常“必需”类型'属性没有设置。“当我从VBA调用它时。实际上,如果我在接口的任何地方定义了数据契约,那么我无法从VBA调用任何WCF的函数。这里有一个关于这个问题http://stackoverflow.com/questions/8001926/using-a-wcf-service-that-c​​ontains-a-datacontract-inside-excel-vba(他结束了使用2个不同的接口来解决问题) – Vampire 2013-04-25 14:06:49

+0

哦,但是当我去了并重新阅读我使用的指南时,你刚刚给了我一个想法。它说:“我发现最好保留原始类型和原始类型的数组,数据契约似乎是不可行的。”我可以使用数组!我可以返回一个对象数组。我需要测试一下 – Vampire 2013-04-25 14:20:44