これは重複ではありません
上記の重複したマーキング ^ は誤りです。
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);
...
私が調べた道は解決策ではありません
- JCL を使用する/使用しない Delphi での CLR のホスティング - 例
- http://www.blong.com/Conferences/BorConUK2002/Interop2/COMNetInterop.htm
これは重複ではありません
ChrisF がこれを重複としてマークしたのは誤りでした。参照されている質問と回答は、開発者が .Net アセンブリを制御および作成する状況のみを参照しています。述べたように、呼び出されようとしているアセンブリはサード パーティ (Saxon) です。質問には十分な回答がありましたが、重複して閉じられるべきではありませんでした。