В моей программе я создаю объекты Com + динамически (с поздним связыванием), используя
Type comObjectType = Type.GetTypeFromProgID(progId, true);
object comObject = Activator.CreateInstance(comObjectType);
А затем вызвать один из методов, используя отражение
object result = comObjectType.InvokeMember(MethodToActivate, BindingFlags.InvokeMethod, null, comObjec, new object[] {....});
Отлично работает в .Net 1.1 / 2.0 / 3.5
Теперь я пытаюсь запустить такой же код на той же машине (Windows XP), скомпилированной для .Net 4.0, но у меня есть
Exception: Method 'System.__ComObject.{MethodName}' not found.
У меня есть исключение для большинства объектов Com + (не для всех).
Кто-нибудь знает в чем проблема?
Почему я получаю исключение в среде FW 4.0?
Что я должен сделать, чтобы избежать этого?
Большое спасибо,
Daniel
После еще одного исследования я обнаружил, что некоторые прокси Com + создаются как System._ComObject
(это, я полагаю, нативные), а некоторые создаются как System.Runtime.Remoting.Proxies._TransparentProxy
(я думаю, что это .Net Com + объекты). Вызов метода отлично работает для тех, кто создан как System._ComObject
и не работает для System.Runtime.Remoting.Proxies._TransparentProxy
.
Наиболее интересным является тот факт, что в .Net 2.0 все объекты создаются одинаково (_ComObject
и _TransparentProxy
), но вызов метода работает нормально.
Еще одним интересным фактом является то, что я вижу «отсутствующий» метод в отладчике с использованием refleon
((System.EnterpriseServices.RemoteServicedComponentProxy)((((System.Runtime.Remoting.Proxies.__TransparentProxy)(ObjectToActivate)))._rp)).ProxiedType.GetMethods()
Некоторое время я думал, что это может быть проблемой безопасности, но я запускаю код, когда WindowsService вошел в систему как пользователь с правами администратора