1

假设我有一个通过 Activator.CreateInstance 实例化的 COM 对象:

object obj = Activator.CreateInstance(myGuid);

现在,我知道这个对象有一个接受 int* 作为参数的函数:

virtual void Method(int * outParameter) = 0;

此方法只是将一个整数写入 outParameter。在 C++ 中,我会这样做:

int parameter = 0;
obj->Method(&parameter);
// parameter now contains the result.

如何通过 MethodInfo.Invoke 在 C# 中进行等效操作?

MethodInfo method = obj.GetType().GetMethod("Method", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
method.Invoke(obj, ???); // What do I put here?
4

2 回答 2

1

你不能,那不是 COM 兼容的函数签名。它必须返回一个 HRESULT 才能兼容,您必须在方法上使用 [PreserveSig] 自己声明接口,以便 CLR 知道不检查返回值并引发异常。它还缺少所需的 __stdcall 属性(又名 STDMETHOD),这是另一个 COM 要求。

您唯一的希望是您弄错了 C++ 声明。最快的检查方法是使用动态关键字:

dynamic obj = Activator.CreateInstance(myGuid);
int parameter;
obj.Method(out parameter);

或者,因为它实际上看起来很像一个属性获取器:

int parameter = obj.Method();

但是期望它会随机抛出异常和/或堆栈不平衡。需要进行彻底的测试以确保随机返回值不会触发异常。

但是,这是很多猜测,最好不要这样做,特别是如果您确定签名。改为编写 C++/CLI 包装器。

于 2013-10-21T09:23:46.247 回答
0

尝试在for中传递一个int包含单个元素的数组:parametersmethod.Invoke

var byrefArg = new int[1];
method.Invoke(obj, .... , new Object[] { byrefArg }, ...);
var outParameter = byrefArg[0];
于 2013-10-21T09:05:54.767 回答