C# 如何将包含UDT安全数组的IDL结构封送到托管代码
我有一个用IDL代码定义的COM库: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
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;
}
问候