En mi programa puedo crear objetos COM + dynamicly (finales de unión) utilizandoCom + enlace en tiempo de C# 4.0
Type comObjectType = Type.GetTypeFromProgID(progId, true);
object comObject = Activator.CreateInstance(comObjectType);
y luego llamar a uno de estos métodos utilizando la reflexión
object result = comObjectType.InvokeMember(MethodToActivate, BindingFlags.InvokeMethod, null, comObjec, new object[] {....});
Funciona greate en .Net 1,1/2,0/3,5
Ahora estoy tratando de ejecutar el mismo código en la misma máquina (Windows XP) compilado para .Net 4.0, pero he conseguido un
Exception: Method 'System.__ComObject.{MethodName}' not found.
Tengo la excepción para la mayoría de los objetos Com + (no para todos). ¿Alguien sabe cuál es el problema? ¿Por qué obtengo la excepción en el entorno FW 4.0? ¿Qué debo hacer para evitarlo?
Muchas gracias, Daniel
Después de un poco más de investigación he descubierto que algunos de los servidores proxy COM + se crean como System._ComObject
(esos son los nativos, supongo), y algunos son creados como System.Runtime.Remoting.Proxies._TransparentProxy
(I piense que esos son objetos .Net Com +). La invocación al método funciona bien para aquellos que se crean como System._ComObject
y no funciona para System.Runtime.Remoting.Proxies._TransparentProxy
. El hecho más interesante es que en .Net 2.0 todos los objetos se crean de la misma manera (_ComObject
y _TransparentProxy
) pero la invocación al método funciona bien. Otro hecho interesante es que puedo ver el método de "perdido" en el depurador utilizando reflecton
((System.EnterpriseServices.RemoteServicedComponentProxy)((((System.Runtime.Remoting.Proxies.__TransparentProxy)(ObjectToActivate)))._rp)).ProxiedType.GetMethods()
pensé por un momento que podría ser un problema de seguridad, pero ejecuta el código como servicio de windows conectado como usuario con privilegios de administrador
¿Ha comprobado algún problema de 32/64 bits? Tal vez su proceso sea de 64 bits y, por lo tanto, llegue al registro COM de 64 bits (donde nadie vive :-)? –
No creo que sea un problema de 32/34 bits, mi máquina local es de 32 bits, por lo que el servidor remoto –
está bien para 32/64 bits. Ahora, parece que su servidor COM no está en proceso o tiene un modelo de subprocesamiento específico (de ahí los proxies). ¿Puedes dar más detalles sobre esto? ¿están alojados fuera de proceso? En servicios de componentes? ¿Y los argumentos de Invocar? ¿Estás seguro de que no hay ambigüedad? ¿Qué pasa con los BindingFlags? ¿no necesitas Public | Instance? –