使用C#中的参数打包IDispatch调用(使用DISPPARAMS)

使用C#中的参数打包IDispatch调用(使用DISPPARAMS),c#,com,automation,marshalling,idispatch,C#,Com,Automation,Marshalling,Idispatch,我正在对支持IDispatch的遗留COM对象使用Invoke进行后期绑定。这似乎是必要的,因为.NET的Type.GetMethod Type.InvokeMember似乎无法处理这些对象 以下代码适用于从对象获取属性,调用者将属性名称作为字符串传递,以便通过后期绑定获取属性值。该类在其构造函数中获取一个对象,并将this.idisp(和this.lcid)设置为指向该对象的接口指针(欢迎评论!) 我现在正试图编写setter等价物,即 public void InvokeSet(string

我正在对支持IDispatch的遗留COM对象使用Invoke进行后期绑定。这似乎是必要的,因为.NET的Type.GetMethod Type.InvokeMember似乎无法处理这些对象

以下代码适用于从对象获取属性,调用者将属性名称作为字符串传递,以便通过后期绑定获取属性值。该类在其构造函数中获取一个对象,并将this.idisp(和this.lcid)设置为指向该对象的接口指针(欢迎评论!)

我现在正试图编写setter等价物,即

public void InvokeSet(string propertyName, object newValue)
但是,我不知道如何用C#打包调度参数

i、 e.如何设置结构:

System.Runtime.InteropServices.ComTypes.DISPPARAMS 

我知道我需要创建一个从托管对象到封送的非托管变量。有什么建议吗?

很晚才去参加聚会,我知道,但我为你找到了答案

// Create the DISPPARAMS struct
var pDispParams= default(System.Runtime.InteropServices.ComTypes.DISPPARAMS);
// Set the number of unnamed parameters
pDispParams.cArgs = 1;

// Marshal a value to a variant
int value = 10;
IntPtr pVariant = Marshal.AllocCoTaskMem(16); // Default VARIANT size
Marshal.GetNativeVariantForObject(value, pVariant);

// Set the unnamed parameter arguments
pDispParams.rgvarg = pVariant;

// Call the IDispatch.Invoke
int result = this.idisp.Invoke(id, ref guid, (uint)this.lcid, 
    (ushort)System.Runtime.InteropServices.ComTypes.INVOKEKIND.INVOKE_PROPERTYGET,
    ref pDispParams, out pVarResult, ref pExcepInfo, pArgErr);
我很难想出如何在C#中封送变量。我发现它基本上回答了我和你所有悬而未决的问题


希望这仍然有帮助。

将Args与INVOKE\u PROPERTYGET一起使用?当您传递参数时,您不应该只使用PUT、PUTREF或方法标志吗?
// Create the DISPPARAMS struct
var pDispParams= default(System.Runtime.InteropServices.ComTypes.DISPPARAMS);
// Set the number of unnamed parameters
pDispParams.cArgs = 1;

// Marshal a value to a variant
int value = 10;
IntPtr pVariant = Marshal.AllocCoTaskMem(16); // Default VARIANT size
Marshal.GetNativeVariantForObject(value, pVariant);

// Set the unnamed parameter arguments
pDispParams.rgvarg = pVariant;

// Call the IDispatch.Invoke
int result = this.idisp.Invoke(id, ref guid, (uint)this.lcid, 
    (ushort)System.Runtime.InteropServices.ComTypes.INVOKEKIND.INVOKE_PROPERTYGET,
    ref pDispParams, out pVarResult, ref pExcepInfo, pArgErr);