2

2つの文字列パラメーターを受け取るメソッドを持つComVisibleクラスを含むC#アセンブリがあります。アセンブリを登録し、DelphiXE2の[コンポーネントのインポート]コマンドを使用してインポートしました。

C#インターフェイスは次のようになります。

[ComVisible(true),
 Guid("132D7742-D86A-49E4-81FD-D804E6872475"),
 InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IResourceManager
{        
    int AddResource(string guid, string address);
}

インポートされたDelphiインターフェイスは次のようになります。

IResourceManager= dispinterface
['{132D7742-D86A-49E4-81FD-D804E6872475}']
function AddResource(const Guid: WideString; const address: WideString): Integer; dispid 1610743809;
end;

Delphiからコードが呼び出される方法の例を次に示します。

procedure TResourceManager.AddResource(const Guid, Address: String);
var
  ResourceManager: IResourceManager;
begin
  ResourceManager := CoResourceManager.Create;
  ResourceManager.AddResource(Guid, Address);
end;

Delphiアプリケーションからメソッドに空の文字列を渡さない限り、すべてが100%機能します。すると、.Net側で次のエラーが発生します。

InvalidVariantが検出されましたメッセージ:アンマネージドVARIANTからマネージドオブジェクトへの変換中に無効なVARIANTが検出されました。無効なVARIANTをCLRに渡すと、予期しない例外、破損、またはデータ損失が発生する可能性があります。

理想的には、Delphi側から空の文字列''を使用してメソッドを呼び出し、.Net側でstring.IsNullOrEmpty(guid)を実行してこの状態をチェックできるようにします。これまでのところ、Delphiから''の代わりに#0をメソッドに渡すことしかできませんでしたが、.Net側では、値は"\ 0"になり、nullでも空でもありません。

これに対処するための正しいアプローチは何ですか?

ありがとう。

4

0 に答える 0