Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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# 如何将包含UDT安全数组的IDL结构封送到托管代码_C#_C++_Com_Marshalling_Atl - Fatal编程技术网

C# 如何将包含UDT安全数组的IDL结构封送到托管代码

C# 如何将包含UDT安全数组的IDL结构封送到托管代码,c#,c++,com,marshalling,atl,C#,C++,Com,Marshalling,Atl,我有一个用IDL代码定义的COM库: struct T_GPSParamsMap { BSTR Key; BSTR Value; }T_GPSParamsMap; struct T_FwClient { BSTR Alias; SMSFilterActionEnum Action; BSTR Text; int ToC

我有一个用IDL代码定义的COM库:

struct T_GPSParamsMap
{
  BSTR  Key;
  BSTR  Value;    
}T_GPSParamsMap;


struct T_FwClient
{
  BSTR                      Alias;
  SMSFilterActionEnum       Action;
  BSTR                      Text;
  int                       ToCall;
  int                       ToState;
  SAFEARRAY(T_GPSParamsMap) GpsData;
} T_FwClient;


struct T_SMSAction
{
  int                       ActionID;
  SMSFilterActionEnum       Action;
  BSTR                      Text;
  BSTR                      Folder;
  BSTR                      DestAddress;
  int                       ToCall;
  int                       ToState;
  SAFEARRAY(T_GPSParamsMap) GpsData;

  VARIANT_BOOL          forwardToNotListed;
  SAFEARRAY(T_FwClient) FwClients;

} T_SMSAction;

[
object,
uuid(F7942BCA-5122-46BB-94DB-89F5071842E4),
dual,
oleautomation,
nonextensible,
helpstring("ISMSFilter Interface"),
pointer_default(unique)
]
interface ISMSFilterWrapper : IDispatch{
  [id(1), helpstring("method GetFilterResult")] 
  HRESULT Init([in] BSTR schema_file_path, [out, retval] long* pVal);

  [id(2), helpstring("method GetFilterResult")] 
  HRESULT ApplyFilter([in] T_SMS* sms, [out, retval] long* pVal);

  [id(3), helpstring("method GetFilterResult")] 
  HRESULT GetFilterResult([in, out] T_SMSAction* ret_val, [out, retval] long* pVal);
};
现在,我在c#中这样使用它:

SMSFilterLib.T_SMS smsFilter = new SMSFilterLib.T_SMS();
SMSFilterLib.T_SMSAction smsRule = new SMSFilterLib.T_SMSAction();

smsFilter.CalledParty = Convert.ToString(RadioID);
smsFilter.CallingParty = "1";
smsFilter.Text = Text;

m_smsFilter.ApplyFilter(ref smsFilter);

int RV = m_smsFilter.GetFilterResult(ref smsRule);
最后一行引发了一个异常(翻译自意大利语):

HResult=-2146233054

“System.TypeLoadException”类型的首次意外异常无法 封送“SMSFilterLib.T_SMSAction”类型的已归档GpsData:否 支持此类型的封送处理

此COM库用于旧的VB6应用程序,运行良好

我使用visualstudio的标准CCW(通过引用添加)在c#中导入了它,但可能它需要一个自定义CCW

有人能给我一些如何使用它的建议吗

问候,,
Daniele

要使用Visual Studio“添加引用窗口”添加COM引用,请使用tlbimp.exe创建互操作程序集

当通过VisualStudio添加COM库时,它将通过tlbimp创建其定义,并将开关/sysarray传递给它,该开关“将SAFEARRAY作为System.Array导入”

不使用VS,而是手动使用tlbimp,不通过该开关:

tlbimp.exe COM_DLL_NAME.DLL/out:INTEROP_ASSEMBLY_NAME.DLL

它将创建专门的类型化数组:

  [Guid("4162E179-7E99-4783-95D9-DA9A0B3BE568")]
  public struct T_SMSAction
  {
    public SMSFilterActionEnum Action;
    public int ActionID;
    public string DestAddress;
    public string Folder;
    public short forwardToNotListed;
    public T_FwClient[] FwClients;
    public T_GPSParamsMap[] GpsData;
    public string Text;
    public int ToCall;
    public int ToState;
  }
问候