如何将SAFEARRAY从C#传递到COM?
我有一个ATLCOM服务器,接口的方法是如何将SAFEARRAY从C#传递到COM?,c#,com,C#,Com,我有一个ATLCOM服务器,接口的方法是 CVivsBasic::UpdateSwitchPlan(BSTR plan_name, SAFEARRAY* plan) 此函数的IDL如下所示 typedef struct { LONG time_to_play; BSTR ecportid; } SwitchPlanItem; HRESULT UpdateSwitchPlan([in] BSTR plan_name, [in] SAFEARRAY(SwitchPlanI
CVivsBasic::UpdateSwitchPlan(BSTR plan_name, SAFEARRAY* plan)
此函数的IDL如下所示
typedef struct
{
LONG time_to_play;
BSTR ecportid;
} SwitchPlanItem;
HRESULT UpdateSwitchPlan([in] BSTR plan_name, [in] SAFEARRAY(SwitchPlanItem) plan) ;
我试着这样称呼它:
internal void UpdateSwitch(string plan_name, string ecportid)
{
SwitchPlanItem sp1;
sp1.time_to_play = 33;
sp1.ecportid = ecportid;
SwitchPlanItem sp2;
sp2.time_to_play = 33;
sp2.ecportid = ecportid;
SwitchPlanItem[] sps = { sp1, sp2 };
sdk.UpdateSwitchPlan(plan_name, sps);
}
但它崩溃了。将SAFEARRAY从C#传递到COM的正确方法是什么?我认为这里的问题是,您使用的是用户定义类型(UDT)的
SAFEARRAY
,VARIANT
,BSTR
和IUnknown
的SAFEARRAY
,但对于UDT
,您需要帮助封送员。请参阅MSDN中关于的这篇文章。我认为这个问题的答案与此类似:
基本上,使用传入SAFEARRAY(STRUCT)的接口的C#客户端必须在导入的COM服务器引用属性上定义嵌入互操作类型=False。我也有同样的问题。有办法做到这一点吗?文章从本地客户端的角度提到了一些东西。。。