1

C# と VBScript で動作する COM オブジェクトを開発しています。また、32 ビットと 64 ビットをサポートする必要があります。

私が抱えている問題は、ポインターにあります。私の .IDL の一部を参照してください

HRESULT Copy([in] PTRTYPE destAddr, [in] PTRTYPE srcAddr, [in] int bytes); 

PTRTYPE を void* として宣言すると、c# はそれらを IntPtr と見なし、VB6/VBScript はそれらを "As Any" と見なします。

このアプローチの問題は、「Any」型パラメーターを使用した単純なポインター計算を実行できないことです。

PTRTYPE を long (および 64 ビットで「ハイパー」) として宣言すると、ポインター演算を実行できるようになりますが、C# では、32/64 ビット プラットフォームに応じて、同じメソッドに対して 2 つの異なる定義があります。

VARIANT を PTRTYPE 型として使用することは避けたいと思います。

C# と VBScript の両方と互換性を持たせる方法はありますか?

前もってありがとう、マウロ。

4

2 に答える 2

0

あなたのタイプの消費者にポインター計算を強制しないことをお勧めします。

これを void として宣言すると、消費者に操作を強制する代わりに、常にオフセットをパラメーターとして渡すことができます。これは、.NET フレームワークのこのArray.Copyオーバーロードに少し似ている可能性があります。ここでは、ソース + 宛先に単純な整数として渡されるオフセットがあります。

これを行うことで、どのコンシューマーを選択してもメソッドが正しく機能するようになり、コンシューマーに依存する代わりに、独自のコードで検証 (つまり、オフセットが正当であることを確認する) を行う手段が提供されます。

于 2012-02-17T20:10:47.343 に答える
0

私が採用した解決策は次のとおりです。

1) .idl を別のフォルダーにコピーします。

2) IntPtr にしたい変数の __int3264 を void* に置き換えます

3) .idl ファイルから .tlb ファイルを作成します。

4) .tlb ファイルに基づいてプライマリ相互運用機能を構築します。

出来上がり!

よろしく、マウロ。

于 2012-03-15T15:40:51.430 に答える