Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#COM通过MethodInfo进行互操作。调用:int*参数?_C#_Com_Interop - Fatal编程技术网

C#COM通过MethodInfo进行互操作。调用:int*参数?

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(&parameter

假设我有一个通过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?

尝试为
方法传递
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包装器,尽管我试图避免这种情况!