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でも空でもありません。
これに対処するための正しいアプローチは何ですか?
ありがとう。