11

これは重複ではありません

上記の重複したマーキング ^ は誤りです。

Delphi 2010 プログラムから .NET ライブラリ (登録済みの COM オブジェクトではない) のパラメータ化されたメソッドを呼び出すにはどうすればよいですか?

具体的には、ここに記載されているように、Saxon API にアクセスしたいと考えています。具体的には、XsltCompiler を作成して BaseURI プロパティを読み取ることはできますが、設定することはできません。

Win32 COM サーバー オブジェクト (mscoree.dll および mscorlib.dll) と遅延バインディングを使用して、ある程度成功しました。これは Project-Jedi TJclClrHost コンポーネントの例のおかげです。.NET アセンブリを読み込み、.NET オブジェクトを作成し、単純な文字列プロパティまたはパラメーターなしの関数を読み取ることができます。私の質問は、パラメータを渡す方法ですか?

この問題は、Saxon .NET アセンブリからロードされた XsltCompiler のベース URI を設定する方法のタスクによって例示されます。BaseUri の API はここに文書化されており、その重要な部分は ...

public Uri BaseUri {get; set; }

リフレクションを使用して、セッター関数の名前が「set_BaseUri」であることがわかりました。

このメソッドは、からインポートされたタイプ ライブラリから Late Binding/Reflection を使用して呼び出すことができますmscorlib.dll。関連するメソッドを以下に示します。

_Type = interface(IDispatch)
  ['{BCA8B44D-AAD6-3A86-8AB7-03349F4F2DA2}']
....
  function InvokeMember(const name: WideString; invokeAttr: BindingFlags; const Binder: _Binder; 
                      Target: OleVariant; args: PSafeArray; modifiers: PSafeArray; 
                      const culture: _CultureInfo; namedParameters: PSafeArray): OleVariant; safecall;
...
end;

私がこれまでに試したことは何ですか?

私の Delphi 2010 プログラムでは、..

FType.InvokeMember( 'set_BaseUri',
  BindingFlags_Public or BindingFlags_Instance or BindingFlags_InvokeMethod or
  BindingFlags_SetField or BindingFlags_SetProperty,
  nil, FInstance, args, modifiers, nil, nil);

ここで: FTypeタイプは_Typeです。 argsおよびmodifiers両方とも長さ 1 の PSafeArray です。modifiers は、引数が参照渡しか値渡しかを示すブール値の配列であると想定されています。この場合、これは値が False (値渡し) の 1 つのブール値の配列です。args は、実際のパラメーター値の配列であると想定されています。

あらゆる種類の配列要素タイプを試しましたが、「指定された配列は期待されるタイプではありませんでした」というエラーが表示され続けます。

これは、args safeArray を文字列に設定する私のコードです。

var
  args: PSafeArray;
  argsbound: TSafeArrayBound;
  PassByRef: boolean;
  Idx: integer;
  OValue: OleVariant;
begin
Idx := 0;
argsbound.cElements := 1;
argsbound.lLbound   := 0;
args := SafeArrayCreate( VT_VARIANT, 1, argsbound);
OValue := 'www.abc.net.au';
SafeArrayPutElement( args, Idx, OValue);
...

私が調べた道は解決策ではありません

これは重複ではありません

ChrisF がこれを重複としてマークしたのは誤りでした。参照されている質問と回答は、開発者が .Net アセンブリを制御および作成する状況のみを参照しています。述べたように、呼び出されようとしているアセンブリはサード パーティ (Saxon) です。質問には十分な回答がありましたが、重複して閉じられるべきではありませんでした。

4

1 に答える 1

3

Saxon API にはあまり詳しくありませんが、Delphi、.NET、および COM の相互運用性には精通しています。

私がお勧めするのは、お気に入りの (または最も許容できる) .NET 言語で、Saxon API の周りにファサード パターンを作成することです。これらのラッパー クラスの ComVisible を True のままにします。次に、Delphi でCOM Interopを介してこのラッパー アセンブリにアクセスします。

アダプター パターンを使用して実際に回避することもできますが、Saxon API 全体にアクセスする必要はないと想定しているため、ファサードの方が適切です。

于 2013-06-04T03:35:23.763 に答える