如何将SAFEARRAY从C#传递给COM?

时间:2009-09-15 04:23:46

标签: c# com

我有一个ATL COM服务器,其中接口的方法是

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) ;    

我试图用C#这样调用它:

        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的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

我认为这里的问题是您使用SAFEARRAY用户定义类型(UDT),SAFEARRAY VARIANTBSTR和{{1}开箱即用,但对于IUnknown你需要帮助编组。请参阅MSDN中有关Passing Safearray of UDTs的文章。

答案 1 :(得分:0)

我认为这个问题的答案与此类似: COM - [in] parameter as SAFEARRAY(STRUCT)

基本上,使用传入SAFEARRAY(STRUCT)的接口的C#客户端必须在导入的COM服务器引用属性上定义嵌入互操作类型=错误