Nel mio programma creo oggetti COM + dynamicly (associazione tardiva) utilizzandoCom + tardiva C# 4.0
Type comObjectType = Type.GetTypeFromProgID(progId, true);
object comObject = Activator.CreateInstance(comObjectType);
e quindi chiamare uno dei metodi utilizzando la riflessione
object result = comObjectType.InvokeMember(MethodToActivate, BindingFlags.InvokeMethod, null, comObjec, new object[] {....});
Funziona greate in .Net 1,1/2,0/3,5
Ora sto cercando di eseguire lo stesso codicesulla stessa macchina (Windows XP) compilato per .Net 4.0, ma ho un
Exception: Method 'System.__ComObject.{MethodName}' not found.
Ho l'eccezione per la maggior parte degli oggetti Com + (non per tutti). Qualcuno sa qual è il problema? Perché ottengo l'eccezione nell'ambiente FW 4.0? Cosa devo fare per evitarlo?
Grazie mille, Daniel
Dopo un po 'di più indagini ho scoperto che alcuni dei COM + proxy vengono creati come System._ComObject
(questi sono quelli nativi, suppongo), e alcuni sono creati come System.Runtime.Remoting.Proxies._TransparentProxy
(I pensa che quelli siano. Com + oggetti). L'invocazione del metodo funziona correttamente per quelli creati come System._ComObject
e non funziona per System.Runtime.Remoting.Proxies._TransparentProxy
. Il fatto più interessante è che in .Net 2.0 tutti gli oggetti sono creati allo stesso modo (_ComObject
e _TransparentProxy
) ma l'invocazione del metodo funziona correttamente. Un altro fatto interessante è che posso vedere il metodo "mancante" nel debugger utilizzando reflecton
((System.EnterpriseServices.RemoteServicedComponentProxy)((((System.Runtime.Remoting.Proxies.__TransparentProxy)(ObjectToActivate)))._rp)).ProxiedType.GetMethods()
ho pensato per qualche momento che potrebbe essere un problema di sicurezza, ma eseguire il codice come servizio di windows connesso come utente con privilegi di amministratore
Hai controllato qualche problema 32/64-bit? Forse il tuo processo è a 64-bit e quindi il registro COM a 64-bit (dove nessuno vive :-)? –
Non penso che sia un problema 32/34-bit, la mia macchina locale è a 32 bit, quindi è il server remoto –
ok per 32/64-bit. Ora, sembra che il tuo server COM non sia in-process o abbia uno specifico modello di threading (da qui i proxy). Puoi dare maggiori dettagli su questo? sono ospitati fuori processo? Nei servizi componenti? E che dire degli argomenti Invoke? sei sicuro che non ci siano ambiguità? Che mi dici di BindingFlags? non hai bisogno di Public | Instance? –