В моей программе я создаю объекты 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? Что мне делать, чтобы этого избежать?
Большое спасибо, даниэль
После некоторого дополнительного исследования я обнаружил, что некоторые из прокси Com + созданы как System._ComObject
(я полагаю, это собственные), а некоторые созданы как System.Runtime.Remoting.Proxies._TransparentProxy
(я думаю, что это объекты .Net Com +). Вызов метода отлично работает для тех, которые созданы как System._ComObject
, и не работают для System.Runtime.Remoting.Proxies._TransparentProxy
. Самым интересным фактом является то, что в .Net 2.0 все объекты создаются одинаково (_ComObject
и _TransparentProxy
), но вызов метода работает нормально. Еще один интересный факт: я могу увидеть "отсутствующий" метод в отладчике с помощью рефлектона.
((System.EnterpriseServices.RemoteServicedComponentProxy)((((System.Runtime.Remoting.Proxies.__TransparentProxy)(ObjectToActivate)))._rp)).ProxiedType.GetMethods()
В какой-то момент я подумал, что это может быть проблема безопасности, но я запускаю код, когда WindowsService вошел в систему как пользователь с правами администратора.