Chiamata di metodi .NET da VB6 tramite DLL visibile COM
-
04-07-2019 - |
Domanda
Ho creato una DLL .NET che rende visibili alcuni metodi COM.
Un metodo è problematico. Sembra così:
bool Foo(byte[] a, ref byte[] b, string c, ref string d)
VB6 dà un errore di compilazione quando provo a chiamare il metodo:
Funzione o interfaccia contrassegnate come limitato o la funzione utilizza un Tipo di automazione non supportato in Visual Basic.
Ho letto che i parametri dell'array devono essere passati per riferimento, quindi ho modificato il primo parametro nella firma:
bool Foo(ref byte[] a, ref byte[] b, string c, ref string d)
VB6 fornisce ancora lo stesso errore di compilazione.
Come posso modificare la firma per essere compatibile con VB6?
Soluzione
Dichiarazione dell'argomento array con " ref " è obbligatorio. Il tuo secondo tentativo avrebbe dovuto funzionare bene, forse hai dimenticato di rigenerare il .tlb?
Codice testato:
[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)
Altri suggerimenti
Prova
[ComVisible(true)]
bool Foo([In] ref byte[] a, [In] ref byte[] b, string c, ref string d)
Qualcosa di correlato a questo era il mio problema. Ho un metodo in C # con la seguente firma:
public long ProcessWiWalletTransaction(ref IWiWalletTransaction wiWalletTransaction)
VB 6 ha continuato a lamentarsi "Funzione o interfaccia contrassegnate come limitate ..." e ho pensato che fosse il mio oggetto personalizzato che uso nella chiamata. Si scopre che VB 6 non può fare a lungo, ha dovuto cambiare la firma in:
public int ProcessWiWalletTransaction(ref IWiWalletTransaction wiWalletTransaction)