この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が必要な場合があります。
誰かが私にそれを使用する方法のいくつかの提案を与えることができますか?
よろしく、ダニエレ