2

いくつかのメソッドを COM で表示する .NET DLL を作成しました。

1つの方法が問題です。次のようになります。

bool Foo(byte[] a, ref byte[] b, string c, ref string d)

メソッドを呼び出そうとすると、VB6 でコンパイル エラーが発生します。

関数またはインターフェイスが制限付きとしてマークされているか、関数が Visual Basic でサポートされていないオートメーションの型を使用しています。

配列パラメーターは参照渡しする必要があると読んだので、署名の最初のパラメーターを変更しました。

bool Foo(ref byte[] a, ref byte[] b, string c, ref string d)

VB6 でも同じコンパイル エラーが発生します。

署名を変更して VB6 と互換性を持たせるにはどうすればよいですか?

4

3 に答える 3

6

「ref」を使用して配列引数を宣言する必要があります。2 回目の試みはうまくいったはずですが、.tlb を再生成するのを忘れたのでしょうか?

テスト済みコード:

[ComVisible(true)]
public interface IMyInterface {
 bool Foo(ref byte[] a, ref byte[] b,string c, ref string d);
}

[ComVisible(true)]
public class MyClass : IMyInterface {
  public bool Foo(ref byte[] a, ref byte[] b, string c, ref string d) {
    throw new NotImplementedException();
  }
}


  Dim obj As ClassLibrary10.IMyInterface
  Set obj = New ClassLibrary10.MyClass
  Dim binp() As Byte
  Dim bout() As Byte
  Dim sinp As String
  Dim sout As String
  Dim retval As Boolean
  retval = obj.Foo(binp, bout, sinp, sout)
于 2008-10-24T13:15:12.570 に答える
1

試す

[ComVisible(true)]
bool Foo([In] ref byte[] a, [In] ref byte[] b, string c, ref string d)
于 2008-10-24T13:05:34.353 に答える
1

これに関連する何かが私の問題でした。次のシグネチャを持つ C# のメソッドがあります。

public long ProcessWiWalletTransaction(ref IWiWalletTransaction wiWalletTransaction)

VB 6 は「関数またはインターフェイスが制限付きとしてマークされています ...」と不平を言い続け、呼び出しで使用するカスタム オブジェクトであると想定しました。VB 6 は長くは機能しないことが判明したため、署名を次のように変更する必要がありました。

public int ProcessWiWalletTransaction(ref IWiWalletTransaction wiWalletTransaction)
于 2009-10-05T09:23:18.237 に答える