C#COM通过MethodInfo进行互操作。调用:int*参数?
假设我有一个通过Activator.CreateInstance实例化的COM对象:C#COM通过MethodInfo进行互操作。调用:int*参数?,c#,com,interop,C#,Com,Interop,假设我有一个通过Activator.CreateInstance实例化的COM对象: object obj = Activator.CreateInstance(myGuid); 现在,我知道这个对象有一个接受int*作为参数的函数: virtual void Method(int * outParameter) = 0; 此方法仅将单个整数写入outParameter。在C++中,我会这样做: int parameter = 0; obj->Method(¶meter
object obj = Activator.CreateInstance(myGuid);
现在,我知道这个对象有一个接受int*作为参数的函数:
virtual void Method(int * outParameter) = 0;
此方法仅将单个整数写入outParameter。在C++中,我会这样做:
int parameter = 0;
obj->Method(¶meter);
// 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?
尝试为
方法传递int
数组和参数中的单个元素。调用:
var byrefArg = new int[1];
method.Invoke(obj, .... , new Object[] { byrefArg }, ...);
var outParameter = byrefArg[0];
尝试为方法传递int
数组和参数中的单个元素。调用:
var byrefArg = new int[1];
method.Invoke(obj, .... , new Object[] { byrefArg }, ...);
var outParameter = byrefArg[0];
不能,这不是COM兼容的函数签名。它必须返回一个HRESULT才能兼容,您必须使用方法上的[PreserveSig]声明接口,以便CLR知道不检查返回值并引发异常。它还缺少必需的uu stdcall属性(也称为STDMETHOD),这是另一个COM要求
你唯一的希望就是你的C++声明错了。最快的检查方法是使用dynamic关键字:
或者,因为它实际上看起来很像属性获取程序:
int parameter = obj.Method();
但是期望它会随机抛出异常和/或堆栈不平衡。需要进行彻底的测试,以确保随机返回值不会触发异常
这是一个很大的猜测,但是,最好不要这样做,特别是如果你是肯定的签名。改为编写C++/CLI包装程序。您不能,这不是COM兼容的函数签名。它必须返回一个HRESULT才能兼容,您必须使用方法上的[PreserveSig]声明接口,以便CLR知道不检查返回值并引发异常。它还缺少必需的uu stdcall属性(也称为STDMETHOD),这是另一个COM要求
你唯一的希望就是你的C++声明错了。最快的检查方法是使用dynamic关键字:
或者,因为它实际上看起来很像属性获取程序:
int parameter = obj.Method();
但是期望它会随机抛出异常和/或堆栈不平衡。需要进行彻底的测试,以确保随机返回值不会触发异常
这是一个很大的猜测,但是,最好不要这样做,特别是如果你是肯定的签名。改为编写C++/CLI包装。使用OleView打开COM DLL,并向我们显示IDL中定义的方法的确切签名。我希望我的答案看起来像HRESULT方法([out]int*p)
。使用OleView打开COM DLL,并向我们显示IDL中定义的方法的确切签名。我希望我的答案看起来像HRESULT Method([out]int*p)
。我尝试使用的对象似乎不是一个合适的COM对象(可能是我无法直接实例化它的原因…),我现在正在使用C++/CLI包装器,尽管我试图避免这种情况!我尝试使用的对象似乎不是一个合适的COM对象(可能是我无法直接实例化它的原因…),我现在使用的是C++/CLI包装器,尽管我试图避免这种情况!