我有一个独立的应用程序,它公开 COM 接口(interface)/CoClasses/Enums 等。其中一个接口(interface)导出以下函数:
procedure FindTask(const TaskId: WideString; var Task: OleVariant); safecall;
注:
Task
也暴露为 CoClass
.注:
Task
是 [进,出]到目前为止,我的遗留应用程序(也是用 Delphi 编写的)已经能够与独立应用程序进行通信。将该独立应用程序视为进程外 COM 服务器,并将此旧应用程序视为客户端应用程序。
当我在 C# 中重写旧的 Delphi 应用程序(客户端)时,我必须在 C# 中使用 COM Interop 来与该应用程序进行通信。因此,我使用 tlbimp.exe 将这些 COM 接口(interface)转换为 C# 接口(interface)。
该方法翻译如下:
void FindTask(string, TaskId, ref object Task);
如何调用 FindTask 并接收具有此签名的已存在任务的结果?
我试过这个:(任务是 CoClass 类型)
ScTask target = new CsTask();
scheduler.FindTask("A GUID value", ref target);
但是编译器对类型大喊大叫,因为该类类型没有重载(翻译的方法接收一个对象)
我可以这样做吗?
object target = new object();
scheduler.FindTask("A GUID value", ref target);
ScTask translated = (ScTask) target;
如何调用需要
var
的方法(in, out)
Variant *
,因此翻译为对象,但实际上有更精确的类型?
最佳答案
在我看来,该参数实际上是一个输出参数。您实际上似乎并没有尝试传递任何东西。该方法似乎正在返回一个不同的对象。所以在 C# 中它应该是:
void FindTask(string TaskId, out object Task);
然后你会这样称呼它:
您需要更改类型库以指定语义。
如果它真的是输入/输出,那么您将继续使用
ref
并像这样调用方法:object target = null;
scheduler.FindTask("A GUID value", ref target);
ScTask translated = (ScTask) target;
或者可能传入一个具有有意义状态的实际对象,如果它是这样设计的。
关于c# - 如何处理 COM 互操作中的 var(或 ref)参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31171971/