관리 코드로 UDT의 SAFEARRAY를 포함하는 IDL 구조체 마샬링 방법 : 이제내가이 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
012,351을'System.TypeLoadException'형식의 첫 번째 예외 ' '에서 'SMSFilterLib.T_SMSAction'형식의 GpsData를 마샬링 할 수 없습니다.이 유형에 사용할 수있는 마샬링을 지원하지 않습니다 ( ).
이 COM 라이브러리가 오래된 VB6 응용 프로그램에서 사용하고 잘 작동합니다 ..
나는 비주얼 스튜디오 (참조를 통해 추가)의 표준 시계 반대 방향으로 사용하지만, 어쩌면 가질 필요가 C#에서 그것을 가져온맞춤 CCW.
누군가 사용법을 알려 줄 수 있습니까?
안부, 다니엘