sto avendo qualche problema con interoperabilità COM, la situazione è la seguente:utilizzare 32bit COM Server da un programma a 64 bit di .NET
a 32 bit COM Exe Server (che è stato programmato in C++) offre una classe con alcune funzioni membro che si occupano di hardware di terze parti (questo hardware lega anche il server COM Exe a 32 bit, poiché il produttore non supporta 64 bit).
Desidero utilizzare il server COM Exe a 32 bit in un'applicazione .NET (C#) a 64 bit ... All'inizio ho provato ad aggiungere un riferimento al server Exe in Visual Studio 2010 e ha creato un'interoperabilità -DLL. Questo Interop-DLL mi ha fornito le funzioni necessarie, uno dei quali è dichiarato come:
int Initialize(ref string callingApplicationPath);
La dichiarazione originale in C++ si presenta così:
LONG Class::Initialize(BSTR* callingApplicationPath)
... e come questo in IDL:
[id(1)] LONG Initialize([in] BSTR* callingApplicationPath);
Tuttavia, quando voglio chiamare questa funzione da C# tramite l'Interop-DLL, si getta un BadImageFormatException. Sembra che l'Interop-DLL sia una DLL a 32 bit (forse c'è la possibilità di generare una DLL a 64 bit?).
Il mio prossimo tentativo è stato quello di istanziare il server Exe con questo codice:
Type type = Type.GetTypeFromProgID("OurCompany.Class");
Object o = Activator.CreateInstance(type);
Object[] args = { Marshal.StringToBSTR(str) };
Object result = type.InvokeMember("Initialize", BindingFlags.InvokeMethod, null, o, args);
Questo codice, d'altra parte, getta un TargetInvocationException (In particolare: 0x80020005 (DISP_E_TYPEMISMATCH)) alla mia testa. Sfortunatamente non sono riuscito a scoprire quale tipo devo passare alla funzione da C# ... Ho provato tutte le funzioni StringToXXX nella classe Marshal ma niente sembra funzionare:/Immagino che mi manchi qualcosa di semplice qui ma non vedo cosa.
Qualsiasi aiuto è molto apprezzato!
migliori saluti
Christian
Hai provato a lanciare Process Monitor e guarda cosa succede quando viene eseguita l'istanziazione? Forse non trova alcune voci di registro o qualche processo ha diritti insufficienti? Process Monitor migt aiuta con quello. – sharptooth
@sharptooth: l'istanziazione stessa funziona bene e posso chiamare con successo un metodo fittizio che non accetta argomenti e restituisce un int. Il problema è "solo" la conversione System.String -> BSTR * – Christian
che vedo. Qual è il punto di passaggio di BSTR * come parametro "in"? Perché non solo BSTR? – sharptooth