在我的節目我用COM +後期綁定C#4.0
Type comObjectType = Type.GetTypeFromProgID(progId, true);
object comObject = Activator.CreateInstance(comObjectType);
,然後使用反射調用的方法之一創建COM +對象動態地(後期綁定)
object result = comObjectType.InvokeMember(MethodToActivate, BindingFlags.InvokeMethod, null, comObjec, new object[] {....});
它的工作原理馬麗娟在.net 1.1/2.0/3.5
現在我試圖在爲.NET 4.0編譯的同一臺計算機(Windows XP)上運行相同的代碼,但我有一個
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登錄作爲具有管理員權限的用戶
您是否檢查過任何32/64位問題?也許你的程序是64位的,因此打到64位COM註冊表(沒有人住:-)? – 2011-04-27 06:17:03
我不認爲這是一個32/34位的問題,我的本地機器是32位,遠程服務器 – 2011-04-27 07:14:53
對32/64位也是如此。現在,它看起來像你的COM服務器不在進程中或具有特定的線程模型(因此代理)。你能提供更多細節嗎?他們託管在過程之外嗎?在組件服務中?那麼Invoke參數呢?你確定沒有歧義嗎?那BindingFlags呢?你不需要Public | Instance嗎? – 2011-04-27 07:49:12