【发布时间】:2017-03-27 21:27:13
【问题描述】:
我继承了一个 VB6 应用程序,该应用程序可以启动 Excel、打开工作簿并按时间间隔运行宏。该宏通过其参数返回值。在我尝试使用互操作将其转换为 C# 时,我可以成功运行宏,但不会返回这些参数值。
下面的代码中是否缺少某些内容/不正确,或者根本不支持?
VBA 宏:
Sub Foo(bar As Long)
bar = 5
End Sub
C#代码:
void CallFoo()
{
// Declared as an object to avoid losing the value in auto-boxing
// The result is the same if declared as int
Object bar = 0;
m_application.Run(m_fooCommand, a);
Console.WriteLine(a); // a is always 0
}
这个(大致)等效的 VB6 代码可以很好地获取返回值。
Dim bar as Long
bar = 0
xlApp.Run "Test.xlsm!Foo", bar
MsgBox bar // prints 5
【问题讨论】:
-
Excel.Application.Run甚至没有在 VBA 中分配ByRef。您确定 VB6 代码正在做您认为它正在做的事情吗? -
如果
a被 ByRef 传递,那么在 C# 中它将是ref a -
如果
Run参数不是ByRef,那么VB6 代码不可能按照您描述的方式工作。 没有魔法。此时你的问题不看VB6代码就无法回答。 -
另外,VB6默认
ByRef,是C#方法签名没有声明ref。 -
是的,它可以返回单个值。我想我应该在示例中更清楚地说明,重点是它实际上可以返回多个最初由多个参数返回的值。