如何将包含 UDT 安全数组的 IDL 结构封送到托管代码
本文关键字:结构 IDL 托管代码 数组 包含 UDT 安全 | 更新日期: 2023-09-27 18:34:01
>我有一个用这个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应用程序,运行良好。
我已经使用Visual studio的标准CCW将其导入到c#中(通过引用添加),但也许它需要具有自定义CCW。
有人可以给我一些如何使用它的建议吗?
问候丹尼尔
若要使用 Visual Studio "Add Reference Windows" 添加 COM 引用,请使用 tlbimp 创建一个互操作程序集.exe
当通过Visual Studio添加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;
}
问候。