0

この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が必要な場合があります。

誰かが私にそれを使用する方法のいくつかの提案を与えることができますか?

よろしく、ダニエレ

4

1 に答える 1

1

Visual Studio の [参照ウィンドウの追加] を使用して COM 参照を追加する代わりに、tlbimp.exe を使用して相互運用アセンブリを作成します。

COM ライブラリが Visual Studio を介して追加されると、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;
  }

よろしく。

于 2012-05-23T15:28:18.557 に答える